class Window
{
protected:
WNDCLASSEX wc;
HWND hWnd;
public:
LPCTSTR ClassName;
LPCTSTR WindowName;
int x;
int y;
int nWidth;
int nHeight;
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
Window()
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, //на эту строчку ругается error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'WNDPROC'
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"D3D Tutorial", NULL };
RegisterClassEx( &wc );
// Create the application's window
HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
NULL, NULL, wc.hInstance, NULL );
// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// Enter the message loop
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
UnregisterClass( L"D3D Tutorial", wc.hInstance );
}
};
Простой класс создает ошибку при компиле!
Прошу вас помочь разобраться с такой проблемой. Имеется следующий код:
Код:
Что можно с этим сделать? Класс-то ведь предельно простой, но такая фигня выдается при компиле! Как исправить?
static LRESULT WINAPI MsgProc
Спасибо, Nixus, сработало! Но позволь задать вопрос, почему оно сработало?.. Просто хотелось бы разобраться.
Потому что без static ты определяешь не статический метод класса, который должен быть вызван с спередачей указателя на класс (чего WinAPI делаеть не умеет). Со static ты по сути задаешь обычную функцию, которой не требуется передача указателя на класс.
Код:
#include <windows.h>
class Window
{
public:
HWND handle;
WNDCLASS window_class;
LPCTSTR class_name;
LPCTSTR window_name;
int x, y, width, height;
static LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
//Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
//Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
void Init()
{
window_class.style=CS_CLASSDC;
window_class.lpfnWndProc=&MsgProc;
window_class.cbClsExtra=0L;
window_class.cbWndExtra=0L;
window_class.hbrBackground=NULL;
window_class.hCursor=NULL;
window_class.hIcon=NULL;
window_class.hInstance=GetModuleHandle(NULL);
window_class.lpszClassName=class_name;
window_class.lpszMenuName=NULL;
RegisterClass( &window_class );
handle=CreateWindow( class_name, window_name,
WS_OVERLAPPEDWINDOW, x, y, width, height,
NULL, NULL, window_class.hInstance, NULL );
}
void Show()
{
ShowWindow(handle, SW_SHOWDEFAULT);
UpdateWindow(handle);
}
};
int main()
{
Window window;
window.class_name=L"xiu";
window.window_name=L"pizda";
window.x=0;
window.y=0;
window.height=800;
window.width=600;
window.Init();
window.Show();
return 0;
}
class Window
{
public:
HWND handle;
WNDCLASS window_class;
LPCTSTR class_name;
LPCTSTR window_name;
int x, y, width, height;
static LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
//Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
//Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
void Init()
{
window_class.style=CS_CLASSDC;
window_class.lpfnWndProc=&MsgProc;
window_class.cbClsExtra=0L;
window_class.cbWndExtra=0L;
window_class.hbrBackground=NULL;
window_class.hCursor=NULL;
window_class.hIcon=NULL;
window_class.hInstance=GetModuleHandle(NULL);
window_class.lpszClassName=class_name;
window_class.lpszMenuName=NULL;
RegisterClass( &window_class );
handle=CreateWindow( class_name, window_name,
WS_OVERLAPPEDWINDOW, x, y, width, height,
NULL, NULL, window_class.hInstance, NULL );
}
void Show()
{
ShowWindow(handle, SW_SHOWDEFAULT);
UpdateWindow(handle);
}
};
int main()
{
Window window;
window.class_name=L"xiu";
window.window_name=L"pizda";
window.x=0;
window.y=0;
window.height=800;
window.width=600;
window.Init();
window.Show();
return 0;
}
Скомпилилось и заработало, но окно консоли просто промелькнуло и мгновенно исчезло, но никакого окна не показалось:( Что делать?
ОБАНА!!!!! Вставил перед ретурном из мейна слип на 5 секурд и узрел своё окно!!! Но такая фигня, что в теле самого окна находится то, что было под ним на рабочем столе или в других окнах под созданным мной окном. Как это исправить?
window_class.hbrBackground = (HBRUSH)(COLOR_3DSHADOW+1);
И не пишите матом в коде. Потом привыкнете, а оно вылезет в самый неудачный момент при демонстрации проекта заказчику...
Спасибо, написал и сработало, но все равно если поверх моего окна окажется другое, то от другого окна остается шлейф, короче, не перерисовывается оно:(
Попробуй доверить системе перерисовку твоего окна, убрав обработку WM_PAINT из MsgProc.
Опыты показали, что системе тоже нельзя доверять - эффект тот же самый.
Код:
void Show()
{
MSG Msg;
ShowWindow(handle, SW_SHOWDEFAULT);
UpdateWindow(handle);
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
{
MSG Msg;
ShowWindow(handle, SW_SHOWDEFAULT);
UpdateWindow(handle);
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}