游客已登陆 (0)未知
笔行证 257310
昵称 kuan 
笔贝 Score1
加为好友 发送短信
<< << 2009 一月 >> >>
123
45678910
11121314151617
18192021222324
25262728293031

访问计数:27141
本文:343 今天:2 本月 343

本地音乐播放器



 
       消息处理函数的简单封装
2007-06-28 晴



/*
把窗口函数封装在CCmdTarget类中,而窗口类CFrameWnd则以CCmdTarget基类来派生

为了在类的声明中可以清楚地看到各个消息处理函数,烦人的switch-case结构陷落起来,
在CCmdTarget中,单独声明每个消息各自所对应的处理函数,而在AfxWndProc的各个case
中,调用CCmdTargt类中的这些消息处理函数.
*/

#include<windows.h>
#include<stdio.h>

//定义全局变量
HINSTANCE hInst;
HINSTANCE hInstance;

MSG msg;
char lpszClassName[]="窗口";
char *ShowText;

//函数声明
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//CCmdTarget类-----------------------------------------------
class CCmdTarget
{
public:
HWND hWnd;
//窗口函数
LRESULT CALLBACK AfxWndProc(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam);

virtual void OnLButtonDown();//鼠标消息处理函数
void OnDraw(HDC hdc); //重绘消息处理函数
virtual void OnDestroy(); //WM_DESTROY消息处理函数
};
//CCmdTarget的成员函数
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);
}
void CCmdTarget::OnDestroy()
{
::PostQuitMessage(0);
}
//------------------窗口类----------------------------------
class CFrameWnd:public CCmdTarget
{
public:
HWND hWnd;
public:
int RegisterWindow();
void Create(LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
void ShowWindow(int mCmdShow);
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,
120,50,800,600,
NULL,
NULL,
hInstance,
NULL);

}
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd,nCmdShow);
}
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="kuan重新定义的消息处理";
InvalidateRect(hWnd,NULL,1);
}

//------由CwinApp类派生CMyApp类,加了这个-------------------------------------
class CMyApp: public CWinApp
{
public:
BOOL InitInstance(int nCmdShow); //重新定义InitInstance函数
};//注意分号

//重新定义的成员函数InitInstance.加了这个
CMyApp::InitInstance(int nCmdShow)
{
//m_pMainWnd= new CFrameWnd;
CMyWnd * pMainWnd=new CMyWnd;//应用窗体的派生类定义窗体对象//加
pMainWnd->Create(NULL,"用新的InitInstance函数的程序");
pMainWnd->ShowWindow(nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd=pMainWnd;//加
return TRUE;
}


//CWinApp theApp;
//这里要改一下
CMyApp MyApp;

//全局函数
CWinApp *AfxGetApp()//加
{
return MyApp.m_pCurrentWinApp;
}
//主函数______________________________________________________
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ResultCode=-1;
CWinApp *pApp;
pApp=AfxGetApp();
pApp->InitInstance(nCmdShow);
return ResultCode=MyApp.Run();
}


//窗口函数--------------------------------------------

LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
/*
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_LBUTTONDOWN:
ShowText="kuanlovefeng";
InvalidateRect(hWnd,NULL,1);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,50,50,ShowText,12);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);

}
return 0;
*/
CWinApp *pApp=AfxGetApp();
return pApp->m_pMainWnd->AfxWndProc(hWnd,message,wParam,lParam);
}.
# posted by kuan @ 2007-06-28 13:32:43 评论(0)
 








 
笔 名:
*
评 论:
最多1000字。当前字数:0
*
联系方式: