Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Главное окно с уникальным классом


Автор: Gwendolen 19.9.2006, 21:46
Пожалуста помогите!!!
Нужно создать главное окно с уникальным классом для
FindWindow(DIALOG_UNICUM_CLASS, nil); из ресурса диалога.
Пока не вижу другого выхода как писать runtime окно, которое никогда не видно, а только обрабатывает сообщения. А окна с ресурсов делать дочрними.
Использую MinGW Developer Studio 2.05 ()
При приведенном ниже коде прога запускается, а окно не видно.
res.rc:
Код

1000 DIALOGEX 6,6,194,102
CAPTION "FORM"
CLASS "WWWWWESSFFFSF"
FONT 8,"MS Sans Serif"
STYLE 0x10CF0000
EXSTYLE 0x00000000
BEGIN
  CONTROL "BOTTON",1001,"Button",0x50010000,38,16,114,63,0x00000000
END


prj.cpp:
Код

#include <windows.h>

BOOL CALLBACK MainDlgProc( HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam )
  {
     switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return TRUE;
         break;
         case WM_SYSCOMMAND:
            if (wParam == SC_CLOSE)
              {
                 EndDialog(wnd, 0);
                 PostQuitMessage(0);
                 return TRUE;
              }
         break;
      }
     return FALSE;
  }

LRESULT CALLBACK WindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
  {
      switch( msg )
      {
         case WM_DESTROY :
             PostQuitMessage(0);
             return 1;
         break;     
      }    
      return DefWindowProc(wnd,msg,wParam,lParam);
  }    

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     MSG msg;    
     HWND MainWnd;
     WNDCLASSEXA wc;
     
     wc.cbSize=sizeof(WNDCLASSEXA);
     wc.style=CS_HREDRAW or CS_VREDRAW;
     wc.lpfnWndProc=(WNDPROC)WindowProc;
     wc.cbClsExtra=0;
     wc.cbWndExtra=DLGWINDOWEXTRA;
     wc.hInstance=hInstance;
     wc.hIcon=LoadIcon(NULL, IDI_QUESTION);
     wc.hCursor=LoadCursor(NULL,IDC_ARROW);
     wc.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
     wc.lpszMenuName= NULL;
     wc.lpszClassName="WWWWWESSFFFSF";
     /**/
     RegisterClassEx(&wc);
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, NULL);
     ShowWindow(MainWnd, SW_SHOW );
     /*
     
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, MainDlgProc);
     ShowWindow(MainWnd, SW_SHOW );
     */
     
     
     while (GetMessage(&msg,0,0,0) )
        {
         if (MainWnd!=0)
            {
             if (IsDialogMessage(MainWnd, &msg))
               {continue;}
            }
         TranslateMessage(&msg);
         DispatchMessage(&msg);
        }
     return 0;
  }


А вот так работет, НО БЕЗ КЛАССА:
Код

---res.rc---
...
CAPTION "FORM"
/*
CLASS "WWWWWESSFFFSF"
*/
FONT 8,"MS Sans Serif"
...

---prj.cpp---
...
/*
     RegisterClassEx(&wc);
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, NULL);
     ShowWindow(MainWnd, SW_SHOW );
    */
     MainWnd=CreateDialog(hInstance, MAKEINTRESOURCE(1000), 0, MainDlgProc);
     ShowWindow(MainWnd, SW_SHOW );     
...


И что самое интересное этот код работает как надо (окно видно):

Код

program Project1;

{$R '..\res.res' '..\res.rc'}

uses
  windows,
  messages;

function WindowProc(wnd:HWND; Msg : UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
 begin
   case msg of
     WM_DESTROY :
       begin
         PostQuitMessage(0);
       end;
   else
     Result:=DefWindowProcW(wnd,msg,wParam,lParam);
   end;
 end;

var
  wc:  tagWNDCLASSEXA;
  MainWnd: HWND;
  msg:  tagMSG;
begin

   wc.cbSize:=sizeof(tagWNDCLASSEXA);
   wc.style:=CS_HREDRAW or CS_VREDRAW;
   wc.lpfnWndProc:=@WindowProc;
   wc.cbClsExtra:=0;
   wc.cbWndExtra:=DLGWINDOWEXTRA;
   wc.hInstance:=HInstance;
   wc.hIcon:=LoadIcon(0, IDI_QUESTION);
   wc.hCursor:=LoadCursor(0,IDC_ARROW);
   wc.hbrBackground:=COLOR_BTNFACE+1;
   wc.lpszMenuName:= '';
   wc.lpszClassName:='WWWWWESSFFFSF';
   RegisterClassEx(wc);
   MainWnd:=CreateDialog(HInstance, MAKEINTRESOURCE(1000), 0, nil);
   ShowWindow(MainWnd, SW_SHOW );

  while GetMessage(msg,0,0,0) do
    begin
       if mainWnd<>0 then
         if IsDialogMessage(mainWnd,msg) then
           continue;
       TranslateMessage(msg);
       DispatchMessage(msg);
    end;
end.



Автор: Gwendolen 19.9.2006, 22:20
Даа...
Тему можно закрывать. А ведь 3 часа искал.
Раскопал только тогда когда заменил RegisterClassEx на RegisterClass и задумался...
Я никкогда не использовал wc.hIconSm паскалю это по барабану а С видно не нравится.
Вот так все супер!!!
wc.hIconSm= NULL;

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