Проблемы с перерисовкой окна...!!!???
От: Russian Patriot Россия  
Дата: 25.09.04 04:27
Оценка:
Здравствуйте, все.
Объясните пожалуйста как перерисовывать окно, есть например такой код:
#include <windows.h>
HWND hWnd, hBtn;
HINSTANCE hInst;
int X(0),Y(0);
LRESULT CALLBACK WndProc(HWND,UINT,UINT,LONG);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,int nCmdShow)
{
WNDCLASS WndClass;
hInst = hInstance;
MSG Msg;
char szClassName[]="TestProga";

WndClass.style =CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc =WndProc;
WndClass.cbClsExtra =0;
WndClass.cbWndExtra =0;
WndClass.hInstance =hInstance;
WndClass.hIcon =NULL;
WndClass.hCursor =LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName =NULL;
WndClass.lpszClassName =szClassName;

if(!RegisterClass(&WndClass)){
MessageBox(NULL,"Cannot register class","ERROR",MB_OK);
return 0;
}

hWnd=CreateWindow(szClassName, "Test programm",
WS_SYSMENU | WS_MINIMIZEBOX,
400, 200, 400, 400,
NULL,NULL,hInstance,NULL);
if(!hWnd){
MessageBox(NULL, "Cannot creat window", "ERROR", MB_OK);
return 0;}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&Msg, NULL, 0, 0)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(Message){
case WM_CREATE:X = 100;Y = 100;
hBtn = CreateWindow("button", "temp", WS_CHILD | WS_VISIBLE, 10, 10, 100, 20, hWnd, (HMENU)100, hInst, NULL);
break;
case WM_COMMAND:
switch(wParam){
case 100:X+=5;UpdateWindow(hWnd);
break;}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);MoveToEx(hdc, 50, 50, 0);
LineTo(hdc, X, Y);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd,Message,wParam,lParam);
}
return 0;
}
почему при нажатии кнопки окно не перерисовывается, зато перерисовывается если свернуть и развернуть окно.??
Re: Проблемы с перерисовкой окна...!!!???
От: AlexBS Украина  
Дата: 25.09.04 05:33
Оценка:
Здравствуйте, Russian Patriot, Вы писали:


RP>почему при нажатии кнопки окно не перерисовывается, зато перерисовывается если свернуть и развернуть окно.??




    case WM_COMMAND:
        switch(wParam)
        {
        case 100:
            X+=5;
            InvalidateRect( hWnd, NULL, TRUE );
            UpdateWindow(hWnd);
            break;
        }
Re[2]: Проблемы с перерисовкой окна...!!!???
От: Russian Patriot Россия  
Дата: 25.09.04 20:52
Оценка: :)
Надо же, а так заработало, Спасибо за подсказку.
Re[2]: Проблемы с перерисовкой окна...!!!???
От: Stanky  
Дата: 26.09.04 21:36
Оценка:
Кстати, UpdateWindow(hWnd); после InvalidateRect( hWnd, NULL, TRUE ); можно убрать!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[3]: Проблемы с перерисовкой окна...!!!???
От: AlexBS Украина  
Дата: 26.09.04 21:56
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Кстати, UpdateWindow(hWnd); после InvalidateRect( hWnd, NULL, TRUE ); можно убрать!!!


В этом коде можно многое убрать.....
Re[3]: Проблемы с перерисовкой окна...!!!???
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 27.09.04 11:28
Оценка:
Hello Stanky, you wrote:

> Кстати, UpdateWindow(hWnd); после InvalidateRect( hWnd, NULL,

> TRUE );
можно убрать!!!

Нежелательно. InvalidateRect всего лишь объявляет часть окна невалидным. И
WM_PAINT будет поставлен в очередь только когда она опустеет. UpdateWindow
принудительно ставит WM_PAINT в очередь.

--
Всего хорошего, Слава
http://slava.users.otts.ru
Posted via RSDN NNTP Server 1.9 gamma
Re[4]: Проблемы с перерисовкой окна...!!!???
От: Stanky  
Дата: 27.09.04 12:02
Оценка:
> Нежелательно. InvalidateRect всего лишь объявляет часть окна
> невалидным. И WM_PAINT будет поставлен в очередь только когда она опустеет.
> UpdateWindow принудительно ставит WM_PAINT в очередь.
>
Ну честно говоря WM_PAINT как таковой в очереди не существует!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: Проблемы с перерисовкой окна...!!!???
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 28.09.04 11:16
Оценка:
Hello Stanky, you wrote:

>> Нежелательно. InvalidateRect всего лишь объявляет часть окна

>> невалидным. И WM_PAINT будет поставлен в очередь только когда она
>> опустеет.
>> UpdateWindow принудительно ставит WM_PAINT в очередь.
>>
> Ну честно говоря WM_PAINT как таковой в очереди не существует!!!

Ну хорошо-хорошо
Вместо "будет поставлен" читать "система пошлет".

--
Всего хорошего, Слава
http://slava.users.otts.ru
Posted via RSDN NNTP Server 1.9 gamma
Re[6]: Проблемы с перерисовкой окна...!!!???
От: Stanky  
Дата: 28.09.04 12:05
Оценка:
> Ну хорошо-хорошо
> Вместо "будет поставлен" читать "система пошлет".
>
Да никого она не посылает!!!
Она просто устанавливает соответствующий бит в состоянии очери потока, а GetMessage возвратит WM_PAINT, если этот бит установлен!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.