#include<windows.h>
HINSTANCE hInstance;
HINSTANCE hInst;
MSG msg;
char lpszClassName[]="窗口";
char *ShowText;
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
class CCmdTarget
{
public:
HWND hWnd;
LRESULT CALLBACK AfxWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
virtual void OnLButtonDown();
void OnDraw(HDC hdc);//这里为何不用virtual呢?
virtual void OnDestroy();
};
//
LRESULT CALLBACK CCmdTarget::AfxWndProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
OnLButtonDown();
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
OnDraw(hdc);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
OnDestroy();
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
void CCmdTarget::OnLButtonDown(){}
void CCmdTarget::OnDraw(HDC hdc)
{
TextOut(hdc,50,50,ShowText,16);//ShowText哪里来的(全局变量定义处,一开始没看到)
}
void CCmdTarget::OnDestroy()
{
::PostQuitMessage(0);
}
class CFrameWnd:public CCmdTarget
{
public:
int RegisterWindow();
void Create(LPCTSTR lpClassName,LPCTSTR lpWindowName);
void ShowWindow(int nCmdShow);
void UpdateWindow();
};
int CFrameWnd::RegisterWindow()
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassName;
return RegisterClass(&wc);
}
void CFrameWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName)
{
RegisterWindow();
hInst=hInstance;
hWnd=CreateWindow(lpszClassName,
lpWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
}
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd,nCmdShow);//隐藏了this?
}
void CFrameWnd::UpdateWindow()
{
::UpdateWindow(hWnd);
}
class CWinApp
{
public:
CWinApp* m_pCurrentWinApp;
public:
CWinApp();
public:
CFrameWnd* m_pMainWnd;
public:
virtual bool InitInstance(int nCmdShow);
int Run();
};
CWinApp::CWinApp()
{
m_pCurrentWinApp=this;
}
bool CWinApp::InitInstance(int nCmdShow)
{
m_pMainWnd=new CFrameWnd;
m_pMainWnd->Create(NULL,"封装的Windows程序");
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
return true;
}
int CWinApp::Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
class CMyWnd:public CFrameWnd
{
void OnLButtonDown();
};
void CMyWnd::OnLButtonDown()
{
ShowText="重新定义的消息处理";//从哪里冒出来的东西
InvalidateRect(hWnd,NULL,1);
}
class CMyApp:public CWinApp
{
public:
bool InitInstance(int nCmdShow);
};
bool CMyApp::InitInstance(int nCmdShow)
{
CMyWnd* pMainWnd=new CMyWnd;
pMainWnd->Create(NULL,"用新InitInstance函数的程序");
pMainWnd->ShowWindow(nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd=pMainWnd;
return true;
}
CMyApp MyApp;//全局对象还是需要的
CWinApp *AfxGetApp()
{
return MyApp.m_pCurrentWinApp;
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
CWinApp *pApp=AfxGetApp();
return pApp->m_pMainWnd->AfxWndProc(hWnd,message,wParam,lParam);
}
//主函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE PreInstance,
LPSTR lpCmdLine,//
int nCmdShow)
{
int ResultCode=-1;
CWinApp *pApp;
pApp=AfxGetApp();
pApp->InitInstance(nCmdShow);
return ResultCode=pApp->Run();
}