博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

rebol

rebol.cublog.cn


抄书上的代码(模仿MFC的封装)
#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();
}

发表于: 2007-05-18 ,修改于: 2007-05-18 15:45,已浏览291次,有评论0条 推荐 投诉


网友评论

发表评论