使用win32 api封装一个CWinApp类? 因为界面方面只需要一个对话框或者托盘形式的,所以不想用MFC。但希望封装性好一点,应用程序类也能从CWinApp派生,请问哪位大侠有CWinApp的实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不想用MFC?但想从CWinApp派生?CWinApp就是MFC中的一个类啊具体实现可以查看MFC的源码 可以去看看 c++ in action(c++实践之路)下面是一个实现,摘自《windows游戏编程》//Application.h#include <windows.h>class CApplication{protected: //是否是全屏模式 int m_bFullScreen; //窗口客户区宽度 int ScreenW; //窗口客户区高度 int ScreenH; //窗口背景画刷 int ClientBKColor; //是否可以改变窗口大小的属性变量 int Change_Size_Able; //是否使用鼠标指针 int Show_Mouse_Cursor; //窗口的激活状态 BOOL bActive; //窗口客户区的相对于屏幕左上角的位置 RECT rectWin; //窗口图标 HICON hIcon; //窗口光标 HICON hCursor; //窗口菜单 HMENU hMenu; //窗口句柄 HWND hWnd;public: //构造函数 CApplication( void ); CApplication( int bFullScr, int ScrW, int ScrH ); //设置窗口的属性函数 void isFullScreen( BOOL bFScr ){m_bFullScreen = bFScr;} void SetScreenW( int ScrW ) {ScreenW = ScrW;} void SetScreenH( int ScrH ) {ScreenH = ScrH;} void ChangeSizeAble(int ChAble){Change_Size_Able = ChAble;} void ShowMouseCursor(int M) {Show_Mouse_Cursor = M;} void SetClientBKColor(int C) {ClientBKColor = C;} //设置应用程序的图标 void Set_hIcon( HINSTANCE hInstance, WORD Icon ) { hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(Icon)); } //设置应用程序的光标 void Set_hCursor( HINSTANCE hInstance, WORD Cursor ) { hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(Cursor)); } //设置应用程序的菜单 void Set_hMenu( HINSTANCE hInstance, WORD Menu ) { hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(Menu)); } //创建窗口 HWND CreateWin( WNDPROC WinProc, HINSTANCE hInstance, TCHAR* WindowName, DWORD winStyle); //处理主窗口消息 LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); //默认消息循环机制 int RunDefault(void); // 外部调用成员变量 int Get_m_bFullScreen(void) {return m_bFullScreen;} int Get_ScreenW(void) {return ScreenW;} int Get_ScreenH(void) {return ScreenH;} int Get_ClientBKColor(void) {return ClientBKColor;} int Get_Change_Size_Able(void) {return Change_Size_Able;} int Get_Show_Mouse_Cursor(void){return Show_Mouse_Cursor;} BOOL Get_bActive(void) {return bActive;} RECT Get_rectWin(void) {return rectWin;} HICON Get_hIcon(void) {return hIcon;} HICON Get_hCursor(void) {return hCursor;} HMENU Get_hMenu(void) {return hMenu;} HWND Get_hWnd(void) {return hWnd;}}; //CApplication.cpp#include "CApplication.h"#include <windows.h>/************************************************************* 函数名: CApplication(...) 属于CApplication类的成员* 功能: 构造函数* 参数说明:* bFullScr 是否全屏* ScrW 客户区的宽度(全屏时就是屏幕的宽度)* ScrH 客户区的高度(全屏时就是屏幕的高度)*************************************************************/CApplication::CApplication(int bFullScr, int ScrW, int ScrH){ m_bFullScreen = bFullScr; //全屏模式 if( bFullScr ) { if( ScrW >= 1024 ) { ScreenW = 1024; ScreenH = 768; } else if( ScrW >= 800 ) { ScreenW = 800; ScreenH = 600; } else { ScreenW = 640; ScreenH = 480; } } //窗口模式 else { ScreenW = ScrW; ScreenH = ScrH; } bActive = FALSE; hWnd = NULL; Show_Mouse_Cursor= TRUE; Change_Size_Able = FALSE; ClientBKColor = WHITE_BRUSH; hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)); hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)); hMenu = NULL;}/************************************************************* 构造函数重载声明*************************************************************/CApplication::CApplication( void ){ m_bFullScreen = FALSE; ScreenW = 640; ScreenH = 480; bActive = FALSE; hWnd = NULL; Show_Mouse_Cursor= TRUE; Change_Size_Able = TRUE; ClientBKColor = WHITE_BRUSH; hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)); hCursor=LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW)); hMenu = NULL;}/************************************************************* 函数名: CreateWin(...) 属于CApplication类的成员* 功能: 定义并且创建应用程序窗口,显示窗口* 参数说明: * WinProc 窗口的消息处理函数名* hInstance 窗口实例句柄* WindowName 窗口的名字和注册名字* winStyle 窗口的类型*************************************************************/HWND CApplication::CreateWin( WNDPROC WinProc, HINSTANCE hInstance, TCHAR* WindowName, DWORD winStyle){ WNDCLASS wc; wc.hInstance = hInstance; wc.lpszClassName = WindowName; wc.lpfnWndProc = WinProc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hIcon = hIcon; wc.hCursor = hCursor; wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = ( HBRUSH )GetStockObject( ClientBKColor ); if( !RegisterClass( &wc ) ) { MessageBox( NULL, "注册窗口类出错!","Error!", MB_OK) ; return FALSE; } //全屏模式 if( m_bFullScreen == TRUE ) { hWnd = CreateWindow( WindowName, WindowName, WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, hMenu, hInstance, NULL ); if( !hWnd ) { MessageBox( NULL, "创建窗口出错!","Error!", MB_OK) ; return FALSE; } } else{//窗口模式 hWnd = CreateWindowEx( 0, WindowName, WindowName, winStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL ); if( !hWnd ) { MessageBox( NULL, "创建窗口出错!","Error!", MB_OK) ; return FALSE; } //获取系统屏幕大小 int Win_W=GetSystemMetrics(SM_CXSCREEN); int Win_H=GetSystemMetrics(SM_CYSCREEN); //求出窗口居于屏幕中央时的左上角位置 int x1=(Win_W-ScreenW)/2; int y1=(Win_H-ScreenH)/2; //根据上面的值,调整窗口的位置 SetWindowPos( hWnd, HWND_NOTOPMOST, x1, y1, ScreenW, ScreenH, SWP_HIDEWINDOW ); //获取客户区的相对于屏幕左上角的位置 GetClientRect( hWnd, &rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 ); } ShowWindow( hWnd, SW_NORMAL ); UpdateWindow( hWnd ); return hWnd;}/************************************************************* 函数名: MsgProc(...) 属于CApplication类的成员* 功能: 处理主窗口消息* 参数说明:* hWnd 表示对应窗口的句柄。* uMsg 传送给消息处理函数的消息。* wParam和lParam 的值与对应的消息有关。*************************************************************/LRESULT CApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch( uMsg ) { //窗口激活状态消息的处理 case WM_ACTIVATEAPP: bActive = (BOOL)wParam; break; //鼠标指针移动消息的处理 case WM_SETCURSOR: if( !Show_Mouse_Cursor ){ SetCursor(NULL); return true; } break; //窗口大小改变消息的处理 case WM_SIZE: if( Change_Size_Able ){ if( m_bFullScreen==0 ){ //获取窗口客户区的屏幕坐标系位置 GetClientRect( hWnd, &rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 ); } } break; //窗口位置改变消息的处理 case WM_MOVE: if( m_bFullScreen==0 ){ //获取窗口客户区的屏幕坐标系位置 GetClientRect( hWnd, &rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin ); ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 ); } break; //窗口最大尺寸和最小尺寸消息的处理 case WM_GETMINMAXINFO: //不可以改变窗口的大小 if( !Change_Size_Able ) { PMINMAXINFO pMM = ( PMINMAXINFO ) lParam; //获取横向、纵向边框的宽度和标题栏的高度 int FrameW = GetSystemMetrics( SM_CXSIZEFRAME ); int FrameH = GetSystemMetrics( SM_CYSIZEFRAME ); int CapH = GetSystemMetrics( SM_CYCAPTION ); //把窗口能被改变到的最小尺寸改为以前的值 pMM->ptMinTrackSize.x = ScreenW + FrameW*2; pMM->ptMinTrackSize.y = ScreenH + FrameH*2 + CapH; //将窗口能被改变到的最大尺寸设为与最小尺寸相同的值 pMM->ptMaxTrackSize.x = pMM->ptMinTrackSize.x; pMM->ptMaxTrackSize.y = pMM->ptMinTrackSize.y; } else { PMINMAXINFO pMM = ( PMINMAXINFO ) lParam; //限制窗口能被改变到的最小尺寸 pMM->ptMinTrackSize.x = 100; pMM->ptMinTrackSize.y = 150; } break; //关闭窗口消息的处理 case WM_CLOSE: DestroyWindow( hWnd ); break; //销毁窗口消息的处理 case WM_DESTROY: PostQuitMessage( 0 ); break; } //调用缺省消息处理过程 return DefWindowProc(hWnd, uMsg, wParam, lParam);}/********************************************************** 函数名: RunDefault(...) 属于CApplication类的成员* 功能: 主窗口消息循环* **********************************************************/int CApplication::RunDefault( void ){ MSG msg; msg.message = WM_NULL; while(msg.message != WM_QUIT) { if( GetMessage(&msg,NULL,0,0) ) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam;} 回复:i_noname 我的意思是说自己实现一个CWinApp类。回复:yuelinsoft 哥们,多谢了!!! VC word 图表 如何暂定指定Dll模块中的线程?? 关于clock()的计时精度 出现定义派生类的错误 请教不规则透明窗口,高手请进! 请问Richedit高手,关于在Richedit插入图片的内存释放问题 用VC怎么写EXCEL文件 请看按钮奇多的程序 如何编一个两个页面的窗体视图程序,在菜单上实现选择窗体。 VS2003创建工程时候的异常显示 关于richedit的重画` 关于自动注册数据源的问题!
CWinApp就是MFC中的一个类啊
具体实现可以查看MFC的源码
下面是一个实现,摘自《windows游戏编程》
//Application.h
#include <windows.h>class CApplication
{
protected:
//是否是全屏模式
int m_bFullScreen;
//窗口客户区宽度
int ScreenW;
//窗口客户区高度
int ScreenH;
//窗口背景画刷
int ClientBKColor;
//是否可以改变窗口大小的属性变量
int Change_Size_Able;
//是否使用鼠标指针
int Show_Mouse_Cursor;
//窗口的激活状态
BOOL bActive;
//窗口客户区的相对于屏幕左上角的位置
RECT rectWin; //窗口图标
HICON hIcon;
//窗口光标
HICON hCursor;
//窗口菜单
HMENU hMenu;
//窗口句柄
HWND hWnd;public:
//构造函数
CApplication( void );
CApplication( int bFullScr, int ScrW, int ScrH ); //设置窗口的属性函数
void isFullScreen( BOOL bFScr ){m_bFullScreen = bFScr;}
void SetScreenW( int ScrW ) {ScreenW = ScrW;}
void SetScreenH( int ScrH ) {ScreenH = ScrH;}
void ChangeSizeAble(int ChAble){Change_Size_Able = ChAble;}
void ShowMouseCursor(int M) {Show_Mouse_Cursor = M;}
void SetClientBKColor(int C) {ClientBKColor = C;}
//设置应用程序的图标
void Set_hIcon( HINSTANCE hInstance, WORD Icon )
{
hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(Icon));
}
//设置应用程序的光标
void Set_hCursor( HINSTANCE hInstance, WORD Cursor )
{
hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(Cursor));
}
//设置应用程序的菜单
void Set_hMenu( HINSTANCE hInstance, WORD Menu )
{
hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(Menu));
} //创建窗口
HWND CreateWin( WNDPROC WinProc,
HINSTANCE hInstance,
TCHAR* WindowName,
DWORD winStyle); //处理主窗口消息
LRESULT MsgProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam ); //默认消息循环机制
int RunDefault(void); // 外部调用成员变量
int Get_m_bFullScreen(void) {return m_bFullScreen;}
int Get_ScreenW(void) {return ScreenW;}
int Get_ScreenH(void) {return ScreenH;}
int Get_ClientBKColor(void) {return ClientBKColor;}
int Get_Change_Size_Able(void) {return Change_Size_Able;}
int Get_Show_Mouse_Cursor(void){return Show_Mouse_Cursor;}
BOOL Get_bActive(void) {return bActive;}
RECT Get_rectWin(void) {return rectWin;}
HICON Get_hIcon(void) {return hIcon;}
HICON Get_hCursor(void) {return hCursor;}
HMENU Get_hMenu(void) {return hMenu;}
HWND Get_hWnd(void) {return hWnd;}
};
#include <windows.h>/************************************************************
* 函数名: CApplication(...) 属于CApplication类的成员
* 功能: 构造函数
* 参数说明:
* bFullScr 是否全屏
* ScrW 客户区的宽度(全屏时就是屏幕的宽度)
* ScrH 客户区的高度(全屏时就是屏幕的高度)
*************************************************************/
CApplication::CApplication(int bFullScr,
int ScrW, int ScrH)
{
m_bFullScreen = bFullScr; //全屏模式
if( bFullScr ) {
if( ScrW >= 1024 ) {
ScreenW = 1024;
ScreenH = 768;
}
else if( ScrW >= 800 ) {
ScreenW = 800;
ScreenH = 600;
}
else {
ScreenW = 640;
ScreenH = 480;
}
}
//窗口模式
else {
ScreenW = ScrW;
ScreenH = ScrH;
} bActive = FALSE;
hWnd = NULL;
Show_Mouse_Cursor= TRUE;
Change_Size_Able = FALSE;
ClientBKColor = WHITE_BRUSH; hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION));
hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW));
hMenu = NULL;
}
/************************************************************
* 构造函数重载声明
*************************************************************/
CApplication::CApplication( void )
{
m_bFullScreen = FALSE;
ScreenW = 640;
ScreenH = 480;
bActive = FALSE;
hWnd = NULL;
Show_Mouse_Cursor= TRUE;
Change_Size_Able = TRUE;
ClientBKColor = WHITE_BRUSH; hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION));
hCursor=LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW));
hMenu = NULL;
}
/************************************************************
* 函数名: CreateWin(...) 属于CApplication类的成员
* 功能: 定义并且创建应用程序窗口,显示窗口
* 参数说明:
* WinProc 窗口的消息处理函数名
* hInstance 窗口实例句柄
* WindowName 窗口的名字和注册名字
* winStyle 窗口的类型
*************************************************************/
HWND CApplication::CreateWin( WNDPROC WinProc,
HINSTANCE hInstance,
TCHAR* WindowName,
DWORD winStyle)
{
WNDCLASS wc;
wc.hInstance = hInstance;
wc.lpszClassName = WindowName;
wc.lpfnWndProc = WinProc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hIcon = hIcon;
wc.hCursor = hCursor;
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = ( HBRUSH )GetStockObject( ClientBKColor ); if( !RegisterClass( &wc ) )
{
MessageBox( NULL, "注册窗口类出错!","Error!", MB_OK) ;
return FALSE;
} //全屏模式
if( m_bFullScreen == TRUE ) {
hWnd = CreateWindow(
WindowName,
WindowName,
WS_POPUP,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,
hMenu,
hInstance,
NULL );
if( !hWnd ) {
MessageBox( NULL, "创建窗口出错!","Error!", MB_OK) ;
return FALSE;
}
}
else{//窗口模式
hWnd = CreateWindowEx(
0,
WindowName,
WindowName,
winStyle,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
hMenu,
hInstance,
NULL );
if( !hWnd ) {
MessageBox( NULL, "创建窗口出错!","Error!", MB_OK) ;
return FALSE;
} //获取系统屏幕大小
int Win_W=GetSystemMetrics(SM_CXSCREEN);
int Win_H=GetSystemMetrics(SM_CYSCREEN);
//求出窗口居于屏幕中央时的左上角位置
int x1=(Win_W-ScreenW)/2;
int y1=(Win_H-ScreenH)/2;
//根据上面的值,调整窗口的位置
SetWindowPos( hWnd, HWND_NOTOPMOST,
x1, y1, ScreenW, ScreenH,
SWP_HIDEWINDOW );
//获取客户区的相对于屏幕左上角的位置
GetClientRect( hWnd, &rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 );
} ShowWindow( hWnd, SW_NORMAL );
UpdateWindow( hWnd ); return hWnd;
}/************************************************************
* 函数名: MsgProc(...) 属于CApplication类的成员
* 功能: 处理主窗口消息
* 参数说明:
* hWnd 表示对应窗口的句柄。
* uMsg 传送给消息处理函数的消息。
* wParam和lParam 的值与对应的消息有关。
*************************************************************/
LRESULT CApplication::MsgProc( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
switch( uMsg )
{
//窗口激活状态消息的处理
case WM_ACTIVATEAPP:
bActive = (BOOL)wParam;
break;
//鼠标指针移动消息的处理
case WM_SETCURSOR:
if( !Show_Mouse_Cursor ){
SetCursor(NULL);
return true;
}
break;
//窗口大小改变消息的处理
case WM_SIZE:
if( Change_Size_Able ){
if( m_bFullScreen==0 ){
//获取窗口客户区的屏幕坐标系位置
GetClientRect( hWnd, &rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 );
}
}
break;
//窗口位置改变消息的处理
case WM_MOVE:
if( m_bFullScreen==0 ){
//获取窗口客户区的屏幕坐标系位置
GetClientRect( hWnd, &rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin );
ClientToScreen( hWnd, (LPPOINT)&rectWin + 1 );
}
break;
//窗口最大尺寸和最小尺寸消息的处理
case WM_GETMINMAXINFO:
//不可以改变窗口的大小
if( !Change_Size_Able ) {
PMINMAXINFO pMM = ( PMINMAXINFO ) lParam; //获取横向、纵向边框的宽度和标题栏的高度
int FrameW = GetSystemMetrics( SM_CXSIZEFRAME );
int FrameH = GetSystemMetrics( SM_CYSIZEFRAME );
int CapH = GetSystemMetrics( SM_CYCAPTION ); //把窗口能被改变到的最小尺寸改为以前的值
pMM->ptMinTrackSize.x = ScreenW + FrameW*2;
pMM->ptMinTrackSize.y = ScreenH + FrameH*2 + CapH;
//将窗口能被改变到的最大尺寸设为与最小尺寸相同的值
pMM->ptMaxTrackSize.x = pMM->ptMinTrackSize.x;
pMM->ptMaxTrackSize.y = pMM->ptMinTrackSize.y;
}
else {
PMINMAXINFO pMM = ( PMINMAXINFO ) lParam; //限制窗口能被改变到的最小尺寸
pMM->ptMinTrackSize.x = 100;
pMM->ptMinTrackSize.y = 150;
}
break;
//关闭窗口消息的处理
case WM_CLOSE:
DestroyWindow( hWnd );
break;
//销毁窗口消息的处理
case WM_DESTROY:
PostQuitMessage( 0 );
break;
} //调用缺省消息处理过程
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}/*********************************************************
* 函数名: RunDefault(...) 属于CApplication类的成员
* 功能: 主窗口消息循环
*
**********************************************************/
int CApplication::RunDefault( void )
{
MSG msg; msg.message = WM_NULL; while(msg.message != WM_QUIT)
{
if( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
我的意思是说自己实现一个CWinApp类。回复:yuelinsoft
哥们,多谢了!!!