Моя строка состояния не обновляется во время выполнения программы, и я не знаю почему. Сначала псевдокод. Я удалил большую часть, оставив только идею.
#include ... (many includes)
using namespace std;
#include "MyHeaderFile.hpp"
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
//here some global variables. Thereare more of them, I leave only teh important ones.
HWND g_hButtonStart;
MSG msg;
//----------------------------------- windows ------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ WNDCLASSEX wc;
HWND hwnd;memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = CreateSolidBrush(RGB(240,240,240));//(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//window class register
if(!RegisterClassEx(&wc))
{ MessageBox(NULL, "Rejestracja klasy okna nie powiodła się!","BMP->DXF: Błąd!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_WINDOWEDGE,"WindowClass","BMP -> DXF",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
275,
NULL,NULL,hInstance,NULL);
if(hwnd == NULL)
{ MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
//group boxes, text boxes, buttons ...
//most important are the "START" button and the status bar:
g_hButtonStart = CreateWindowEx( 0, "BUTTON", "S T R T", WS_CHILD | WS_VISIBLE, 243, 133, 100, 30, hwnd, NULL, hInstance, NULL );
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );//status bar things
INITCOMMONCONTROLSEX icmc;
icmc.dwSize = sizeof( INITCOMMONCONTROLSEX );
icmc.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx( & icmc );
g_hStatusBar = CreateWindowEx( 0, STATUSCLASSNAME, NULL, SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd,( HMENU ) 200, hInstance, NULL );
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "some info" );
//status bar - endwhile(GetMessage(&msg, NULL, 0, 0))
{ if (!IsDialogMessage(hwnd, &msg))
{TranslateMessage(&msg);
DispatchMessage(&msg); }
}
return msg.wParam;
}
//messages
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{ bool ParameterWarning=false;
string Info;
switch(Message)
{ case WM_CLOSE:
{ DestroyWindow( hwnd );
}
break;
case WM_DESTROY:
{ PostQuitMessage(0);
break;
}
//here is the most important part of the code
case WM_COMMAND:
{ if(( HWND ) lParam == g_hButtonStart )
{ //enabling and disabling some buttons, edit boxes etc.
//some variables declarations and initializations...
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "message 1" );
//opening the in file ...
//reading file parameters and checking for errors ...
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "message 2" );
//here some large calculations start, lasting for 30mins, for example; written in C++
for(int N=0;N<one_of_the_variables;N++)
{
//calculations part 1; also writing to out file ...
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "message 3" );
//calculations part 2; also writing to out file ...
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "message 4" );
//calculations part 3; also writing to out file ...
SendMessage( g_hStatusBar, SB_SETTEXT, 0,( LPARAM ) "message 5" );
}//enabling and disabling some buttons, edit boxes etc. ...
//closing the out file ...
}
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
Во время расчетов в главном окне отображается «(не отвечает)» в заголовке. Это не беспокоит меня (пока). Строка состояния показывает только некоторые сообщения — кажется, что она случайная. Иногда только последнее сообщение, иногда два или три из них. Но он никогда не показывает их все правильно в течение всего расчета. Что я должен сделать, чтобы это работало?
не отвечает это еще один симптом проблемы. Приложение с графическим интерфейсом должно часто обрабатывать свою очередь сообщений. Именно этот акт прокачки очереди сообщений позволяет обновлять пользовательский интерфейс. Ваши долгосрочные задачи не позволяют перекачивать очередь сообщений и приводят к различным проблемам, о которых вы сообщаете.
Решение состоит в том, чтобы часто качать очередь сообщений. Не выполняйте долго выполняющиеся задачи в главном потоке, потому что это лишает вас возможности обслуживать очередь сообщений. Переместите эти задачи в отдельный поток.