WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Win32 - окна из ресурсов, окна в классы итд.

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Win32 - окна из ресурсов, окна в классы итд.
Krotow опубликован 24-08-2001 17:29 MSK   Click Here to See the Profile for Krotow   Click Here to Email Krotow  
Есть вопросы при создании пользовательского интерфейса для "чистых" 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     Click Here to See the Profile for migel  Click Here to Email migel     
насчет в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     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Насчет 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.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.