Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.11;
Скачать: CL | DM;

Вниз

Очень нужна помощь! RegisterClass & CreateWindow.   Найти похожие ветки 

 
Azzazzin   (2002-10-02 15:09) [0]

Очень нужна помощь! RegisterClass & CreateWindow.

Мучаюсь с этим второй день... идей нет :(
Нужна была прога маленькая по весу, решил создавать окошки ручками. Это мой первый опыт в данной области, возможно проблема смешна... возможно я что-то не так делаю :( Почитал этот форум (и не только этот... и не только форум), FAQ (может туда выложить простейшую программку создающую одно окошка силами только WinAPI?) и не нашел ответа...

Имеем программку:


program win_test;

uses
Windows,
Messages;

const
AppName : Pchar = "Win_Test";
ClassName : Pchar = "Win_Test_Class";
var
MyWindow : HWnd;
Message : TMsg;
MyWindowClass : TWndClass;

WWidth : Word = 150;
WHeight : Word = 80;

lpMsgBuf : PChar;

function WindowProc (Window : HWnd; Message, WParam : Word; LParam : LongInt) : LongInt; export; stdcall;
begin
result := DefWindowProc (Window, Message, WParam, LParam);

case Message of
wm_Destroy : PostQuitMessage(0);
end;

end;

Procedure WinMain;
begin

FillChar(MyWindowClass, SizeOf(TWndClass), 0);

if hPrevInst = 0 then
begin
MyWindowClass.style := cs_HRedraw or cs_VRedraw;
MyWindowClass.lpfnWndProc := @WindowProc;
MyWindowClass.hInstance := hInstance;
MyWindowClass.hCursor := LoadCursor (0, idc_Arrow);
MyWindowClass.hbrBackground := GetStockObject(ltGray_Brush);
MyWindowClass.lpszClassName := ClassName;

RegisterClass(MyWindowClass);
end;

MyWindow := CreateWindow (ClassName,
AppName,
ws_SysMenu,
cw_UseDefault,
cw_UseDefault,
WWidth,
WHeight,
GetActiveWindow(),
0,
hInstance,
nil);

ShowWindow (MyWindow, CmdShow);
UpdateWindow(MyWindow);

while GetMessage (Message, 0, 0, 0) do
begin
TranslateMessage (Message);
DispatchMessage (Message);
end;
Halt(Message.wParam);
end;

begin
WinMain;
end.



Вот. В Windows 98 всё замечательно работет... без проблем. А вот с Win NT4/2000 есть проблема. Окошко не закрашивается! Т.е. есть заголовок, рамочка в один пиксель, а бэкграунд окна представляет собой изображение под окошком... т.е. окно какбы "прозрачное" Читал где-то, что закраска бэкграунда окна происходит после вызова функции UpdateWindow, которая посылает окну WM_PAINT... Вот то-ли функция не работает... то-ли... незнаю даже :(

Есть еще одна наметка... вызов RegisterClass. Функция RegisterClass возвращает не ноль (как в Win98 так и в NT), что говорит, о том, что она выполнена успешно, но смотрю GetLastError
вот так:



FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError(),
0,
@lpMsgBuf, // lpMsgBuf : PChar
0,
nil
);
MessageBox( HWND_Desktop, lpMsgBuf, "GetLastError", MB_OK or MB_ICONINFORMATION );



И имеем: В Win98 - всё ОКе... ошибок нет полный Суцесс... а вот в NT - ошибка #2 "The System cannot find the file specified" :( Вот может тут засада?

Заранее ОГРОМНОЕ спасибо!


 
Игорь Шевченко ©   (2002-10-02 15:15) [1]

Просто как пример:

program WinApi;

uses
Windows, Messages, SysUtils;

{$R *.RES}

function MyCoolWndProc (Window: HWND; Message, WParam: Cardinal;
LParam: Cardinal): Longint; stdcall;
var
ps : PAINTSTRUCT;
DC : HDC;
r : TRect;
begin
case Message of
WM_DESTROY:
begin
PostQuitMessage (0);
Result := 0;
Exit;
end;
WM_PAINT:
begin
dc := BeginPaint (Window, ps);
try
TextOut(DC, 0, 0, "Hello, Windows!", 15);
SetRect (R, 100, 100, 100, 100);
DrawText (DC, "Hello, world!", Length("Hello, world!"), R, DT_CALCRECT);
SetBkColor (DC, GetSysColor(COLOR_BTNFACE));
DrawText (DC, "Hello, world!", Length("Hello, world!"), R,
DT_LEFT OR DT_NOPREFIX);
OffsetRect (R, -1, -1);
Inc( R.Right, 3);
Inc( R.Bottom, 2);
DrawEdge (DC, R, EDGE_ETCHED, BF_RECT);
finally
EndPaint (Window, ps);
end;
end;
end;
Result := DefWindowProc (Window, Message, WParam, LParam);
end;

var WClass : WNDCLASS;
MyHWND : HWND;
MyMsg : MSG;

begin
WClass.hInstance := HInstance;
WClass.hIcon := 0;
WClass.hCursor := LoadCursor (0, IDC_ARROW);
WClass.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
WClass.lpfnWndProc := @MyCoolWndProc;
WClass.lpszClassName := "MyCoolClass";
if RegisterClass (WClass) = 0 then begin
RaiseLastWin32Error;
Exit;
end;
MyHWND := CreateWindowEx (0, "MyCoolClass", "MyCoolWindow",
WS_OVERLAPPEDWINDOW,
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
0, 0, HInstance, nil);
if MyHWND = 0 then begin
RaiseLastWin32Error;
Exit;
end;
ShowWindow (MyHWND, SW_SHOWNORMAL);
{
UpdateWindow (MyHWND); // Это обращение к функции вызывает немедленную посылку
// сообщения WM_PAINT
// Если вызов этой функции закомментировать, то окно
// все равно прорисуется, так как оно большую часть
// находится в режиме ожидания.
}
while GetMessage(MyMsg, 0, 0, 0) do begin
TranslateMessage (MyMsg);
DispatchMessage(MyMsg);
end;
end.




 
Azzazzin   (2002-10-02 15:41) [2]

Огромное спасибо!
нашел ошибку :)
У меня в WindowProc Message, WParam : Word, а они LongWord... чорт!

еще раз спасибо!



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

Текущий архив: 2002.11.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-34254
V-A-V
2002-10-24 06:46
2002.11.11
TreeView только DB


14-34235
Skier
2002-10-23 13:49
2002.11.11
У меня Explorer отказывается вводить русские буквы. Как лечить ?


3-33920
Jeka.
2002-10-22 08:17
2002.11.11
Опять индексы и временные таблицы.


1-33927
VZ Alexandr
2002-10-31 20:53
2002.11.11
TreeView


1-34085
}{unter
2002-10-30 17:11
2002.11.11
Если кто занимался картографией