求用c++封装的窗口类,最简单的那种

March0912 2012-04-10 05:37:06
LRESULT CALLBACK MainProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.

WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = NULL;
wc.hInstance = hInstance;
wc.lpfnWndProc = MainProc;
wc.lpszClassName = TEXT("Window");
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;

RegisterClass(&wc);

HWND hwnd = CreateWindow(TEXT("Window"),"text",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
DispatchMessage(&msg);
}

return 0;
}



LRESULT CALLBACK MainProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
{
DestroyWindow(hwnd);
}
break;

case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

以上代码是我用API写的,最简单的只有一个窗口的代码,现在要把它用C++封装成一个窗口类,不要用MFC的那种,就自己封装的,求高手指教!
谢谢!
...全文
289 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzNISSIN 2013-10-28
  • 打赏
  • 举报
回复
小白菜,努力学习中
一场风 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
为何不用WTL?
[/Quote]
+1,WTL很好用~
Jim_King_2000 2012-04-10
  • 打赏
  • 举报
回复
为何不用WTL?
March0912 2012-04-10
  • 打赏
  • 举报
回复
非常感谢lo_back___,但是我想要的不是写成一个类,而是写成三个类,一个初始化类,一个消息映射类,一个窗口类。
lo_back___ 2012-04-10
  • 打赏
  • 举报
回复

//MyWnd.h
#pragma once

#include "windows.h"
class CMyWnd
{
public:
CMyWnd();
virtual ~CMyWnd();
HWND CreateEx(HINSTANCE hInst,DWORD dwExStyle,LPCTSTR lpText,DWORD dwStyle,LPRECT lprcWnd,HWND hParent,int nMenuID,int nIconID);
HWND CreateEx(DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hParent);
void Destroy();
HWND GetWnd();
BOOL Show(int nCmd);
protected:
virtual BOOL PreProcessMsg(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam,LRESULT *pResult);
virtual LRESULT OnCreate(HWND hWnd);
virtual BOOL OnDestroy();
virtual BOOL OnCommand(int nCmdID);
virtual BOOL OnClose();
protected:
BOOL CheckClass(LPCTSTR lpClassName);
static LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam);
public:
HWND m_hWnd;
protected:
HICON m_hIcon;
HMENU m_hMenu;
HINSTANCE m_hInstance;
};



//MyWnd.cpp
#include "CMyWnd.h"
#include "resource.h"

CMyWnd::CMyWnd():m_hWnd(NULL),m_hMenu(NULL),m_hInstance(NULL),m_hIcon(NULL)
{

}

CMyWnd::~CMyWnd()
{
if(m_hWnd)
{
Destroy();
}
}

HWND CMyWnd::CreateEx(HINSTANCE hInst,DWORD dwExStyle,LPCTSTR lpText,DWORD dwStyle,LPRECT lprcWnd,HWND hParent,int nMenuID,int nIconID)
{
if(m_hWnd)
{
return m_hWnd;
}

m_hInstance=hInst;
int x,y,nWidth,nHeight;

if(lprcWnd == NULL)
{
x=y=nWidth=nHeight=CW_USEDEFAULT;
}
else
{
x=lprcWnd->left;
y=lprcWnd->top;
nWidth=lprcWnd->right-lprcWnd->left;
nHeight=lprcWnd->bottom-lprcWnd->top;
}

if(nMenuID > 0)
{
m_hMenu=LoadMenu(m_hInstance,MAKEINTRESOURCE(nMenuID));
}
if(nIconID > 0)
{
m_hIcon=LoadIcon(m_hInstance,MAKEINTRESOURCE(nIconID));
}
CheckClass("MyWnd");
m_hWnd=CreateWindowEx(dwExStyle,"MyWnd",lpText,dwStyle,x,y,nWidth,nHeight,hParent,m_hMenu,m_hInstance,this);

return m_hWnd;
}

HWND CMyWnd::CreateEx(DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hParent)
{
RECT rc={x,y,x+nWidth,y+nHeight};
return CreateEx(NULL,0,"MyWnd",dwStyle,&rc,hParent,0,0);
}

void CMyWnd::Destroy()
{
if(m_hWnd)
{
DestroyWindow(m_hWnd);
m_hWnd=NULL;
}
}

BOOL CMyWnd::Show(int nCmd)
{
return ShowWindow(m_hWnd,nCmd);
}

HWND CMyWnd::GetWnd()
{
return m_hWnd;
}

BOOL CMyWnd::PreProcessMsg(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam,LRESULT *pResult)
{
//Your process code here;

return true;
}

LRESULT CMyWnd::OnCreate(HWND hWnd)
{
//WM_CREATE process hander

m_hMenu=LoadMenu(this->m_hInstance,MAKEINTRESOURCE(IDR_TRAYICON));
m_hIcon=LoadIcon(this->m_hInstance,MAKEINTRESOURCE(IDI_MAIN));
return 0;
}

BOOL CMyWnd::OnDestroy()
{
//WM_DESTROY process hander

Destroy();
PostQuitMessage(0);
return true;
}

BOOL CMyWnd::OnCommand(int nCmdID)
{
//WM_COMMAND process hander

return true;
}

BOOL CMyWnd::OnClose()
{
::SendMessage(this->m_hWnd,WM_DESTROY,0,0);
return true;
}

BOOL CMyWnd::CheckClass(LPCTSTR lpClassName)
{
WNDCLASS ws={0};
if(!GetClassInfo(m_hInstance,lpClassName,&ws))
{
ws.hIcon=m_hIcon;
ws.hbrBackground=(HBRUSH)COLOR_APPWORKSPACE;
ws.lpfnWndProc=WndProc;
ws.lpszClassName=lpClassName;
return RegisterClass(&ws);
}
return true;
}

LRESULT CALLBACK CMyWnd::WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
LRESULT lResult=0;
BOOL bCallDefault=true;

CMyWnd *pWnd=(CMyWnd *)GetProp(hWnd,"MyWnd");
if(pWnd==NULL)
{
if(nMsg!=WM_CREATE)
{
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
else
{
LPCREATESTRUCT pSt=(LPCREATESTRUCT)lParam;
pWnd=(CMyWnd *)pSt->lpCreateParams;
SetProp(hWnd,"MyWnd",pWnd);
}
}

if(!pWnd->PreProcessMsg(hWnd,nMsg,wParam,lParam,&lResult))
{

return lResult;
}

switch(nMsg)
{
case WM_CREATE:
{
pWnd->m_hWnd=hWnd;
lResult=pWnd->OnCreate(hWnd);
bCallDefault=false;
break;
}
case WM_DESTROY:
bCallDefault=pWnd->OnDestroy();
break;
case WM_COMMAND:
bCallDefault=pWnd->OnCommand(LOWORD(wParam));
break;
case WM_CLOSE:
pWnd->OnClose();
bCallDefault=false;
break;
case WM_USERNOTIFY:
pWnd->OnUserNotify(wParam,lParam);
bCallDefault=false;
break;
default:
break;
}

if(bCallDefault)
{
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
else
{
return lResult;
}
}

big_cucumber 2012-04-10
  • 打赏
  • 举报
回复
那回调函数是干啥的

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧