Автор
|
Тема: Win32 - окна из ресурсов, окна в классы итд.
|
Krotow |
опубликован 24-08-2001 17:29 MSK
Есть вопросы при создании пользовательского интерфейса для "чистых" Win32 программ (то есть без изпользовании MFC и ATL) в Visual C++. В частности это относится к созданию окон и контролей в них.1. Как можно на окне, которое создается с помощю CreateWindow()/CreateWindowEx() наложить готовые "Dialog" фреймы из ресурсов, чтобы все контроли (Edit, List, Button итд.) в окне не надо было рисовать программно, что при некотором количеством них уже начинает попахивать мазохизмом :( Наложения Dialog-фрейма па окно изпользовано и внутри в MFC исходниках для CFormView. Там, как заметил, използуется CreateDialogIndirect(). Но там дальше всё выло слишком запутано, чтобы понять, как это сделано. Может есть примеры попроще? 2. Хочется окна, которые создаётся с помощю CreateWindow() и CreateDialog() создавать как классы (сразу с своим WindowProc и минимально необходимой обработкой сообщениий) и наследоватся из них, примерно как это делается в MFC, чтобы для каждого окна не надо было писать свой WindowProc с длиннубущей обработкой сообщений, в которой можно ооочень лего запутатся, если количество окон перевисит 4-5 :( Есть ли идеи/примеры для этого?
|
migel
|
опубликован 24-08-2001 21:31 MSK
насчет в1. Да просто создавай в своем окне диалог как дочерний и все дела case WM_CREATE: { HWND hChild = ::CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CHILD_), hWnd, MyGlobalDlgPrtoc, lParam); } Насчет вопроса 2: В принципе можно: заведи одну функцию окна для всех твоих окошек и сделай ее статической в классе: class TMyBaseClass { bool CreateWindow(....) // some params: virtual ~TMyBaseClass(); // for inheritance! virtual bool OnCreate(...); virtual void OnDestroy();... // rest of virtual methods protected: HWND m_hWnd; private: static LPARAM MyBaseProc(HWND hWnd, UINT uMsg, LPARAM lParam, WPARAM wParam); }bool TMyBaseClass::CreateWindow() { // pass this pointer to the callback function to future use m_hWnd = ::CreateWindow(..... (LPARAM) this); } LPARAM TMyBaseClass::MyBaseProc(HWND hWnd, UINT uMsg, LPARAM lParam, WPARAM wParam) { switch (uMsg) { case WM_CREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; TMyBaseWindow* pThis = (TMyBaseWindow*) lpcs->lpCreateParams; // store this pointer in the MAP /HASH or in the window Prop (by SetProp) return pThis->OnCreate(lpcs); } case WM_DESTROY: { //findClass ptr pThis->OnDestroy(); break; } default: break; } return DefWindowProc(....); } Ну и дальше в том же духе... Надеюсь идея ясна? для диалога все тоже самое только return надо делать через CallWindowProc() предварительно получив стандартный обработчик сообщений диалога; |
m_fox
|
опубликован 28-08-2001 16:14 MSK
Насчет 2: class Dialog { friend BOOL CALLBACK DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); protected: HWND hDialog; HINSTANCE hInst; public: // Provide (read) access to the window's handle in case it is needed // elsewhere. HWND GetHandle( void ) { return hDialog; } // Pure virtual function makes Window an abstract class. virtual BOOL CALLBACK DlgProc( HWND hDlg,UINT uMsg, WPARAM wParam, LPARAM lParam ) = 0; }; BOOL CALLBACK DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
BOOL CALLBACK DlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { Dialog *pDialog = (Dialog *)GetWindowLong( hWnd, GWL_USERDATA ); if ( pDialog == 0 ) { if ( uMsg == WM_INITDIALOG ) { pDialog=(Dialog*)lParam; SetWindowLong( hWnd,GWL_USERDATA, (LONG) pDialog ); pDialog->hDialog=hWnd; return pDialog->DlgProc( hWnd, uMsg, wParam, lParam ); } else return 0;//DefWindowProc( hWnd, uMsg, wParam, lParam ); } else return pDialog->DlgProc( hWnd, uMsg, wParam, lParam ); } Потом наследуй класс Dialog.
|