模拟 MFC 的 CWnd 类的封装,出错的原因都是参数个数不匹配,而我调用的又不是 API 函数,而是类的成员函数,不知道为什么会不匹配.
======================================CWnd.h=====================================
#ifndef CWND_H
#define CWND_H
#include<windows.h>
class CWnd
{
public:
CWnd(HWND Temp=NULL):m_hWnd(Temp){}
BOOL CreateWindowEx(
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
BOOL ShowWindow( HWND hWnd, int nCmdShow);
BOOL UpdateWindow( HWND hWnd );
public: HWND m_hWnd;
};
BOOL CWnd::CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
m_hWnd=::CreateWindowEx(dwExStyle, lpClassName,lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
if(NULL==m_hWnd)
return false;
else
return true;
}
BOOL CWnd::ShowWindow( int nCmdShow)
{
return ::ShowWindow( m_hWnd, nCmdShow);
}
BOOL CWnd::UpdateWindow()
{
return ::UpdateWindow( m_hWnd) ;
}
#endif
========================================winmain.cpp================================
#include"CWnd.h"
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam );
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)COLOR_BACKGROUND;
wndclass.hCursor =LoadCursor(NULL,IDC_APPSTARTING);
wndclass.hIcon=NULL;
wndclass.hInstance =hInstance;
wndclass.lpszClassName =TEXT("First");
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WindowProc;
RegisterClass(&wndclass);
CWnd cwnd;
cwnd.CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("First"),TEXT("模拟CWnd类的封装"),WS_OVERLAPPEDWINDOW ,100,100,200,400,NULL,NULL,hInstance,NULL);
cwnd.ShowWindow(SW_SHOWNORMAL);
cwnd.UpdateWindow ();
MSG msg;
BOOL bRet;
while( (bRet = GetMessage( &msg, cwnd.m_hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
MessageBox(cwnd.m_hWnd ,TEXT("ERROR"),TEXT("WRONG"),MB_OK);
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam ;
}
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,50,TEXT("VC2005.net"), (int)strlen("VC2005.net"));
EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT("mouse click"),TEXT("Myapplication"),MB_OK);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,TEXT("你是否要退出程序?"),TEXT("Myapplication"),MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
#ifndef CWND_H
#define CWND_H
#include<windows.h>
class CWnd
{
public:
CWnd(HWND Temp=NULL):m_hWnd(Temp){}
BOOL CreateWindowEx(
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
BOOL ShowWindow( HWND hWnd, int nCmdShow);
BOOL UpdateWindow( HWND hWnd );
public: HWND m_hWnd;
};
BOOL CWnd::CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
{
m_hWnd=::CreateWindowEx(dwExStyle, lpClassName,lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
if(NULL==m_hWnd)
return false;
else
return true;
}
BOOL CWnd::ShowWindow( int nCmdShow)
{
return ::ShowWindow( m_hWnd, nCmdShow);
}
BOOL CWnd::UpdateWindow()
{
return ::UpdateWindow( m_hWnd) ;
}
#endif
========================================winmain.cpp================================
#include"CWnd.h"
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam );
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)COLOR_BACKGROUND;
wndclass.hCursor =LoadCursor(NULL,IDC_APPSTARTING);
wndclass.hIcon=NULL;
wndclass.hInstance =hInstance;
wndclass.lpszClassName =TEXT("First");
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WindowProc;
RegisterClass(&wndclass);
CWnd cwnd;
cwnd.CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("First"),TEXT("模拟CWnd类的封装"),WS_OVERLAPPEDWINDOW ,100,100,200,400,NULL,NULL,hInstance,NULL);
cwnd.ShowWindow(SW_SHOWNORMAL);
cwnd.UpdateWindow ();
MSG msg;
BOOL bRet;
while( (bRet = GetMessage( &msg, cwnd.m_hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
MessageBox(cwnd.m_hWnd ,TEXT("ERROR"),TEXT("WRONG"),MB_OK);
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam ;
}
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,50,TEXT("VC2005.net"), (int)strlen("VC2005.net"));
EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT("mouse click"),TEXT("Myapplication"),MB_OK);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,TEXT("你是否要退出程序?"),TEXT("Myapplication"),MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
...全文
相关推荐
CWnd-MFC中文手册
CWnd类及其派生类是构建MFC应用程序的基础,它们简化了与Windows API的交互,让开发者能够专注于应用逻辑而不是底层的窗口管理细节。
QT5.15.2安卓模拟器调试实战:从编译错误到成功运行的完整排错手册
本文详细介绍了QT5.15.2在Android模拟器调试过程中遇到的常见编译错误及其解决方案,包括环境配置、架构冲突、NDK版本问题、Gradle构建优化和模拟器连接调试等关键环节。通过实战案例和具体代码示例,帮助开发者快速定位并解决QT5.15.2安卓开发中的各种疑难杂症,提升开发效率。
Android网上购物商城项目实战完整源码
当 JSON 中的时间字段为时间戳(如1710523800)或价格以分为单位(如29990),需自定义转换逻辑。
gain-CWnd.rar_mfc中获取cwnd_visual c_获取HWND_获取窗口口cwnd
MFC将Windows API封装在C++的类中,使得代码更加面向对象,易于理解和管理。在MFC中,`CWnd` 类是所有窗口类的基础,它封装了Windows的`HWND`(句柄)概念。
C++程序中,使用HWND获取CWnd的指针
当你有一个HWND并且知道它对应一个有效的窗口时,你可以直接调用这个函数,传入HWND作为参数,它会返回一个CWnd指针,这样你就可以使用MFC的方式来操作这个窗口了。


