Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Вниз

Проблема с прорисовкой клиентской обл. окна.   Найти похожие ветки 

 
circul   (2003-05-03 16:06) [0]

Начал изучать программирование интерфейса, используя WinApi, и столкнулся с проблемой - в Win98 клиентская область окна после создания прорисовывается и обновляется нормально при перемещении окна, а в WinNT(WS) - совсем не прорисовывается.

Код создания окна - ниже:

program crWnd;

uses windows,Messages;

type
ProcWnd= function(Wnd:HWND;Mess:word;WParam:word;LParam:LongInt):LongInt;stdcall;
var
wc:TWndClass;
wnd:HWND;
Msg:TMsg;
NameClass,NameWnd: PChar;

function MyWndProc(Wnd:HWND;Mess:word;
WParam:word;LParam:LongInt):LongInt;stdcall;
begin
case Mess of
WM_CREATE: Result:=0;
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
else Result:=DefWIndowProc(Wnd,Mess,WParam,LParam);
end;
end;

function RegWndClass(ClassName: PChar; aWndProc: ProcWnd):Boolean;
begin
wc.style:=CS_HREDRAW+CS_VREDRAW;
wc.lpfnWndProc:=@aWndProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(THandle(nil),IDI_APPLICATION);
wc.hCursor:=LoadCursor(THandle(nil),IDC_ARROW);
wc.hbrBackground:=COLOR_WINDOW+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:=ClassName;

Result := True;
if (RegisterClass(wc)=0) then Result := False;

end;

function CreateWnd(ClassName,WndName: PChar): integer;
begin
wnd:=CreateWindow(ClassName,WndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
0,
0,
HInstance,
nil);
Result := wnd;
end;

begin
NameClass := "MyClass";
NameWnd := "MyWndName";
if not RegWndClass(NameClass,@MyWndProc) then
begin
MessageBox(0,"Error(RegWndCass)","Error",MB_OK);
Exit;
end;


wnd := CreateWnd(NameClass,NameWnd);
if wnd = 0 then
begin
MessageBox(0,"Error(CreateWnd)","Error",MB_OK);
Exit;
end;


ShowWindow(wnd,SW_SHOWNORMAL);
UpdateWindow(wnd);

while GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end
end.


 
circul   (2003-05-03 23:46) [1]

После добавления обработки WM_PAINT клиентская область стала перерисовываться (вручную).

Это отличие от Win98(По-умолчанию в Win98 прорисовка работает автоматически)?


 
Nick Denry!   (2003-05-03 23:53) [2]

wc.lpfnWndProc:=@MyWndProc;, а еще лучше DefWndProc;
Описание:
function DefWindowProc(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Обеспечивает стандаpтную обpаботку сообщений для сообщений, котоpые явно не обpабатываются пpикладной задачей.

Паpаметpы:
Wnd: Идентификатоp окна.
Msg: Номеp сообщения.
wParam: Инфоpмация, зависящая от сообщения.

lParam: Инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Результат обpаботки сообщения.


 
Nick Denry!   (2003-05-03 23:55) [3]

Помоему так!


 
e!dGe.   (2003-05-04 11:33) [4]

1) Неверен тип параметров:
type
ProcWnd= function Wnd:HWND;Mess: LongInt;WParam: LongInt;LParam:LongInt):LongInt;stdcall;

function MyWndProc(Wnd:HWND;Mess: LongInt;
WParam: LongInt;LParam:LongInt):LongInt;stdcall;

2) В качестве пожелания:
2.1)
function RegWndClass(ClassName: PChar; aWndProc: ProcWnd):Boolean;
var wc:TWndClass; // Глобальная переменная не нужна (что-то даже трудно сказать, в каких случаях она тебе пригодится, кроме этого)
begin
wc.style:=CS_HREDRAW+CS_VREDRAW;
wc.lpfnWndProc:=@aWndProc;

NameClass,NameWnd: PChar; - в принципе аналогично, при необходимости всегда можно узнать и то и другое

...
2.2) По моему, так интереснее:
if not RegWndClass(NameClass, MyWndProc) then {и без @MyWndProc работает, коли function RegWndClass(ClassName: PChar; aWndProc: ProcWnd):Boolean;}
begin
MessageBox(0,"Error(RegWndCass)","Error",MB_OK);
Exit;
end;
2.3)
function MyWndProc(Wnd:HWND;Mess:LongInt; WParam:LongInt;LParam:LongInt):LongInt;stdcall;
begin
Result:=0; // Сократим размер кода?
case Mess of
WM_CREATE:;
WM_DESTROY: PostQuitMessage(0);
else Result:=DefWIndowProc(Wnd,Mess,WParam,LParam);
end;
end;


 
circul   (2003-05-04 11:56) [5]

>e!dGe. © (04.05.03 11:33)

см. windows.pas:

type
WPARAM = Longint;
{$EXTERNALSYM WPARAM}
LPARAM = Longint;
{$EXTERNALSYM LPARAM}

Из параметров единственное несовпадение - TMsg.Msg,
да и это не принципиально.

Так же, как и остальные замечания суть вопроса не затрагивают.

Смысл вопроса ведь прозрачен достаточно.

Если для NT нужно добавить обработку WM_PAINT вручную, например

function MyWndProc(Wnd:HWND;Mess:word;
WParam:word;LParam:LongInt):LongInt;export;stdcall;
var
hdc: THandle;
ps: TPaintStruct;
Rect: TRect;
begin
...
WM_PAINT:
begin
GetClientRect(Wnd,Rect);
hdc := BeginPaint(Wnd,ps);
RecTangle(hdc,Rect.Left,Rect.Top,Rect.Right,Rect.Bottom);
1,Rect.Bottom-1);
EndPaint(Wnd,ps);
end;


То в Win98 этого не требуется.


 
e!dGe.   (2003-05-04 12:17) [6]


> circul © (04.05.03 11:56)


> см. windows.pas:


> type
> WPARAM = Longint;
> {$EXTERNALSYM WPARAM}
> LPARAM = Longint;
> {$EXTERNALSYM LPARAM}

см. свой код:
> function MyWndProc(Wnd:HWND;Mess: word;
> WParam: word;LParam:LongInt):LongInt;export;stdcall


и делай либо так:
function MyWndProc(Wnd:HWND;Mess: Cardinal;
WParam: WParam;LParam:LParam):LongInt;export;stdcall;
либо никак, не веришь?

The DefWindowProc function calls the default window procedure to provide default processing for any window messages that an application does not process. This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure.

LRESULT DefWindowProc(

HWND hWnd, // handle to window
UINT Msg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

а ты в неё передешь Word"ы? Глупо, хоть бы попробовал что-то изменить. Не ты первый на грабли наступаешь


 
e!dGe.   (2003-05-04 12:19) [7]

Всего-то и делов! Две строчки кода изменить..

program Project1;

uses windows,Messages;

type
ProcWnd= function(Wnd:HWND;Mess: DWord; WParam,LParam:LongInt):LongInt;stdcall;

var
wc:TWndClass;
wnd:HWND;
Msg:TMsg;
NameClass,NameWnd: PChar;

function MyWndProc(Wnd:HWND;Mess: DWord; WParam,LParam:LongInt):LongInt;stdcall;
begin
case Mess of
WM_CREATE: Result:=0;
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
else Result:=DefWIndowProc(Wnd,Mess,WParam,LParam);
end;
end;

function RegWndClass(ClassName: PChar; aWndProc: ProcWnd):Boolean;
begin
wc.style:=CS_HREDRAW+CS_VREDRAW;
wc.lpfnWndProc:=@aWndProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(THandle(nil),IDI_APPLICATION);
wc.hCursor:=LoadCursor(THandle(nil),IDC_ARROW);
wc.hbrBackground:=COLOR_WINDOW+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:=ClassName;

Result := True;
if (RegisterClass(wc)=0) then Result := False;

end;

function CreateWnd(ClassName,WndName: PChar): integer;
begin
wnd:=CreateWindow(ClassName,WndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
0,
0,
HInstance,
nil);
Result := wnd;
end;

begin
NameClass := "MyClass";
NameWnd := "MyWndName";
if not RegWndClass(NameClass,@MyWndProc) then
begin
MessageBox(0,"Error(RegWndCass)","Error",MB_OK);
Exit;
end;


wnd := CreateWnd(NameClass,NameWnd);
if wnd = 0 then
begin
MessageBox(0,"Error(CreateWnd)","Error",MB_OK);
Exit;
end;


ShowWindow(wnd,SW_SHOWNORMAL);
UpdateWindow(wnd);

while GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end
end.



 
e!dGe.   (2003-05-04 12:23) [8]


> То в Win98 этого не требуется.

Х его знает, как это у тебя так, у меня NT, тестить не собираюсь, но уверен, что ты заблуждаешься


 
circul   (2003-05-04 13:59) [9]

Осознаю свою вину-)

Действительно, в данном случае оказалось, что тип параметра и был проблемой.

Спасибо, впредь аккуратнее буду-)


 
e!dGe.   (2003-05-04 16:12) [10]

Желаю удачи.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
1-20085
Карелин Артем
2003-06-24 12:37
2003.07.07
Как раскодировать/закодировать текст в формат UCS2?


1-20049
levova
2003-06-25 15:09
2003.07.07
Динамически созданю обект MyButton:TButton...


3-20012
Status_I
2003-06-15 00:00
2003.07.07
Все те же даты


1-20123
Mishenka
2003-06-23 14:31
2003.07.07
Поиск файлов.


14-20267
Lamer111
2003-06-19 22:45
2003.07.07
чат для локалки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский