Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > проблема с Edit class


Автор: freenity 7.9.2006, 02:21
Здраствуйте.
Есть код, который не компилируется. Ошибка гдето в WindowProc. Вроде бы все нормально, но даже окно не появляется. Вот код:

Код

program WindowsApp;
{$MODE DELPHI}
uses Windows;

const AppName = 'WindowsApp';

var hWindow: hwnd;
    hins : hwnd;
    hwndEdit : hwnd;

function WindowProc(Window: HWnd; AMessage, WParam,
          LParam: Longint): Longint; stdcall; export;
begin
     if Amessage = WM_DESTROY then
        ExitProcess(0)
     else if amessage = WM_CREATE then
     begin
          hwndEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'edit', nil, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL, 50, 35, 200, 25, Window, 1, hins, nil);
          {SetFocus(hwndedit); }
     end;
         WindowProc := DefWindowProc(Window, amessage, wparam, lparam);
end;


procedure WinMain (hinst, hprevinst, cmdline, cmdshow : Longint); stdcall; export;
var
   lhwnd : longint;
   lmsg : msg;
   WindowClass : WNDCLASSEX;
begin
     WindowClass.Style := cs_hRedraw or cs_vRedraw;
     WindowClass.lpfnWndProc := @WindowProc;
     WindowClass.cbClsExtra := 0;
     WindowClass.cbWndExtra := 0;
     WindowClass.hInstance := system.MainInstance;
     WindowClass.hIcon := LoadIcon(0, idi_Application);
     WindowClass.hCursor := LoadCursor(0, idc_Arrow);
     WindowClass.hbrBackground := GetStockObject(WHITE_BRUSH);
     WindowClass.lpszMenuName := nil;
     WindowClass.lpszClassName := AppName;

     RegisterClassEx(WindowClass);
     lhwnd := CreateWindowEx(0, AppName, 'my fakin cool window', WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, cw_UseDefault, cw_UseDefault, 0, 0, system.MainInstance, nil);

     ShowWindow(lhwnd, SW_NORMAL);
     UpdateWindow(lhwnd);

     while GetMessage(@lmsg, 0, 0, 0) do
     begin
           TranslateMessage(lmsg);   {check here @msg}
           DispatchMessage(lmsg);
     end;

end;

begin
     hins := GetModuleHandle(0);
     WinMain(hins, 0, 0, SW_SHOWNORMAL);
end.


Спасибо за помощ.

Автор: Alexeis 7.9.2006, 10:48
В места правки я поставил коментарии
Код

program winmin2;
uses
  Windows,
  Messages; //модуль сообщеий

const AppName = 'WindowsApp';

var
  hWindow: hwnd;
  hins : hwnd;
  hwndEdit : hwnd;

function WindowProc(Window: HWnd; AMessage, WParam,
          LParam: Longint): Longint; stdcall;
begin
  Result := 0; //результат надо всегда возвращать
  case Amessage
  of
    WM_DESTROY : ExitProcess(0);
    WM_CREATE  :
       hwndEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'edit',
                                  nil, WS_CHILD or WS_VISIBLE or WS_BORDER or
                                  ES_LEFT or ES_AUTOHSCROLL,
                                  50, 35, 200, 25,
                                  Window, 1, hins, nil);

     else
       Result := DefWindowProc(Window, amessage,
                               wparam, lparam);
  end;
end;

var
  WindowClass : TWndClassEx;//класс окна не может быть локальной пере
                                                  //менной
procedure WinMain(hinst, hprevinst, cmdline, cmdshow : Longint);
 var
   lhwnd       : THandle;
   lmsg        : TMsg;

begin
  WindowClass.cbSize := SizeOf(WindowClass);//надо указывать размер структуры
  WindowClass.Style := cs_hRedraw or cs_vRedraw;
  WindowClass.lpfnWndProc := @WindowProc;
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hInstance := system.MainInstance;
  WindowClass.hIcon := LoadIcon(0, idi_Application);
  WindowClass.hCursor := LoadCursor(0, idc_Arrow);
  WindowClass.hbrBackground := GetStockObject(WHITE_BRUSH);
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := AppName;
  RegisterClassEx(WindowClass);
  lhwnd := CreateWindowEx(0, AppName,
                         'my cool window', //мат на форуме запрещен
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT,
                         cw_UseDefault, cw_UseDefault,
                          0, 0, system.MainInstance, nil);

   ShowWindow(lhwnd, CmdShow);
   UpdateWindow(lhwnd);

   while GetMessage(lmsg, 0, 0, 0) //передается не указатель а сама пере
   do                                               //менная
     begin
       TranslateMessage(lmsg);
       DispatchMessage(lmsg);
     end;
end;

begin
  hins := GetModuleHandle(nil);
  WinMain(hins, 0, 0, SW_SHOWNORMAL);
end.

Автор: freenity 7.9.2006, 19:05
Спасибо большое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)