win32學(xué)習(xí)之--------面向?qū)ο蟮拇翱陬惙庋b代碼記錄

---創(chuàng)建stdafx.h頭文件

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括峨邊彝族網(wǎng)站建設(shè)、峨邊彝族網(wǎng)站制作、峨邊彝族網(wǎng)頁制作以及峨邊彝族網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,峨邊彝族網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到峨邊彝族省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

#include<Windows.h>
#include<tchar.h>
#include<assert.h>
#include "resource.h"

---創(chuàng)建QWnd類==》窗口基類

    ---QWnd.h文件

#pragma once
#include "stdafx.h"

class QWnd
{
public:
	QWnd(void);
	~QWnd(void);
	virtual BOOL CreateEx(
		DWORD dwExStyle,
		LPCTSTR lpszClassName,
		LPCTSTR lpszWindowName,
		DWORD dwStyle,
		int x,
		int y,
		int nWidth,
		int nHeight,
		HWND hWndParent,
		HMENU nIDorHMenu,
		LPVOID lpParam = NULL
	);
	virtual BOOL PreCreateWindow(CREATESTRUCT & cs);
public:
	BOOL ShowWindow(int nCmdShow);
	BOOL UpdateWindow();
	BOOL DestroyWindow();
public:
	static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
	virtual LRESULT  WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
	virtual LRESULT  Default(UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
	//message handle
	virtual LRESULT onClose(WPARAM wParam, LPARAM lParam);
	virtual LRESULT onDestroy(WPARAM wParam, LPARAM lParam);
	virtual LRESULT onCreate(WPARAM wParam, LPARAM lParam);
public:
	BOOL SubClassWindow(HWND hWnd);
	static QWnd * FromHandle(HWND hWnd);
public:
	HWND m_hWnd;
	WNDPROC m_lpfnOldWndProc;
};

   ---QWnd.cpp文件

#include "QWnd.h"

QWnd::QWnd() {
	m_hWnd = NULL;
	m_lpfnOldWndProc = NULL;
}

QWnd::~QWnd() {

}

 LRESULT CALLBACK QWnd::WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
	 if (uMsg == WM_CREATE || uMsg == WM_NCCREATE) {
		 LPCREATESTRUCT pCs = (LPCREATESTRUCT)lParam;
		 if (pCs) {
			 QWnd* qWnd = (QWnd*) pCs->lpCreateParams;//這個(gè)就是之前CreateWindowEx 傳過來的this  這里的處理原因是因?yàn)镃reateWindowEx在SetWindowLong之前 所以用這種方式
			 if (qWnd) {
				 qWnd->m_hWnd = hWnd;
				 qWnd->m_lpfnOldWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
				 return qWnd->WindowProc(uMsg, wParam, lParam);
			 }

		 }
	 }
	QWnd * qWnd = (QWnd*)GetWindowLong(hWnd, GWL_USERDATA);
	if (qWnd) {

		return qWnd->WindowProc(uMsg, wParam, lParam);
	}
	
	return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
}

LRESULT  QWnd::WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
	case WM_CLOSE:
	{
		return onClose(wParam, lParam);
	}
	break;
	case WM_DESTROY:
	{
		return onDestroy(wParam, lParam);
	}
	break;
	case WM_CREATE:
	{
		return onCreate(wParam, lParam);
	}
	break;
	}
	return Default( uMsg, wParam, lParam);
}
LRESULT   QWnd::Default(UINT uMsg, WPARAM wParam, LPARAM lParam) {
	if (m_lpfnOldWndProc == QWnd::WndProc) {
		return ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
	}
	return m_lpfnOldWndProc(m_hWnd, uMsg, wParam, lParam);
}
//msg handle 
LRESULT QWnd::onClose(WPARAM wParam, LPARAM lParam) {
	return Default( WM_CLOSE, wParam, lParam);
	
}

LRESULT QWnd::onDestroy(WPARAM wParam, LPARAM lParam) {
	return Default(WM_DESTROY, wParam, lParam);
	
}

LRESULT QWnd::onCreate(WPARAM wParam, LPARAM lParam) {
	return Default(WM_CREATE, wParam, lParam);
}

BOOL  QWnd::SubClassWindow(HWND hWnd) {
	assert(hWnd);
	if (m_hWnd == hWnd) {
		return true;
	}
	m_lpfnOldWndProc = (WNDPROC)GetWindowLong(hWnd,GWL_WNDPROC);
	if (m_lpfnOldWndProc != QWnd::WndProc) {
		m_hWnd = hWnd;
		SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this);
		SetWindowLong(m_hWnd, GWL_WNDPROC, (LONG)QWnd::WndProc);
		return TRUE;
	}
	return FALSE;
}
QWnd * QWnd::FromHandle(HWND hWnd) {
	assert(hWnd);
	QWnd * qWnd = (QWnd*)GetWindowLong(hWnd, GWL_USERDATA);
	return qWnd;
}
BOOL QWnd::PreCreateWindow(CREATESTRUCT& cs) {

	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	BOOL bRet = ::GetClassInfoEx(cs.hInstance,cs.lpszClass,&wcex ); //檢查窗口類是否被注冊(cè)
	if (bRet) {
		return true;
	}

	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = cs.hInstance;
	wcex.hIcon = (HICON)::LoadIcon(NULL, (LPCTSTR)IDI_ICON1);
	wcex.hIconSm = (HICON)::LoadIcon(NULL, (LPCTSTR)IDI_ICON1);
	wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
	wcex.hCursor = (HCURSOR)::LoadCursor(NULL, IDC_ARROW);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = cs.lpszClass;
	bRet = ::RegisterClassEx(&wcex);
	if (!bRet) {
		return FALSE;
	}

	return true;
}

BOOL QWnd::CreateEx(
	DWORD dwExStyle,
	LPCTSTR lpszClassName,
	LPCTSTR lpszWindowName,
	DWORD dwStyle,
	int x,
	int y,
	int nWidth,
	int nHeight,
	HWND hWndParent,
	HMENU nIDorHMenu,
	LPVOID lpParam 
) {
	HINSTANCE hInstance = (HINSTANCE)::GetModuleHandle(NULL);
	assert(hInstance);
	CREATESTRUCT cs;
	cs.cx = nWidth;
	cs.cy = nHeight;
	cs.dwExStyle = dwExStyle;
	cs.hInstance = hInstance;
	cs.hMenu = nIDorHMenu;
	cs.hwndParent = hWndParent;
	cs.lpCreateParams = lpParam;
	cs.lpszClass = lpszClassName;
	cs.lpszName = lpszWindowName;
	cs.style = dwExStyle;
	cs.x = x;
	cs.y = y;


	BOOL bRet = PreCreateWindow(cs);
	if (!bRet) {
		MessageBox(NULL, _T("注冊(cè)窗口類失敗"),_T("注冊(cè)窗口類"), 0);
		return false;
	}

	HWND hWnd = CreateWindowEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,x,y,nWidth,nHeight, hWndParent, nIDorHMenu, hInstance,this);//這個(gè)函數(shù)執(zhí)行完 會(huì)發(fā)送WM_CREATE消息  this的作用是因?yàn)樘崆皞鬟f
	if (NULL == hWnd) {
		return FALSE;
	}
	m_hWnd = hWnd;
	SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this);

	m_lpfnOldWndProc = (WNDPROC)GetWindowLong(m_hWnd, GWL_WNDPROC);//原類的處理程序
	if (m_lpfnOldWndProc != QWnd::WndProc) {
		//子類化
		SetWindowLong(m_hWnd, GWL_WNDPROC, (LONG)QWnd::WndProc);
		WindowProc(WM_CREATE,0,0); //這里重新發(fā)送WM_CREATE消息
		WindowProc(WM_NCCREATE, 0, 0); //這里重新發(fā)送WM_CREATE消息
	}
	return TRUE;
}

BOOL QWnd::ShowWindow(int nCmdShow) {
	assert(m_hWnd);
	return ::ShowWindow(m_hWnd, nCmdShow);
}

BOOL QWnd::UpdateWindow() {
	assert(m_hWnd);
	return ::UpdateWindow(m_hWnd);
}

BOOL QWnd::DestroyWindow() {
	assert(m_hWnd);
	return ::DestroyWindow(m_hWnd);
}

---創(chuàng)建QWinApp基類==》應(yīng)用程序基類

   ---QWinApp.h文件

#pragma once
#include "QWnd.h"
#include "QButton.h"
class QMainFrame :
	public QWnd
{
public:
	QMainFrame();
	~QMainFrame();
public:
	LRESULT onClose(WPARAM wParam, LPARAM lParam);
	LRESULT onDestroy(WPARAM wParam, LPARAM lParam);
	virtual LRESULT onCreate(WPARAM wParam, LPARAM lParam);
public:
	QButton *m_wndButton;
};

   ---QWinApp.cpp文件

#include "QWinApp.h"
#include "QGlobal.h"



QWinApp::QWinApp()
{
	m_pMainWnd = NULL;
	g_pWinApp = this;

}


QWinApp::~QWinApp()
{
}

BOOL QWinApp::InitInstance() {
	return TRUE;
}

BOOL QWinApp::ExitInstance() {
	return TRUE;
}

void QWinApp::run() {
	MSG msg;
	while (::GetMessage(&msg, NULL, NULL, NULL)) {
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
}

---創(chuàng)建應(yīng)該程序類的全局變量

    ---創(chuàng)建QGlobal.h頭文件

#pragma once
#include "QWinApp.h"
extern QWinApp* g_pWinApp;
extern QWinApp* GlbGetApp();

   ---創(chuàng)建QGlobal.cpp文件

#include "QGlobal.h"
QWinApp* g_pWinApp = NULL;
QWinApp* GlbGetApp() {
	return g_pWinApp;
}

---創(chuàng)建QWnd的子類--子控件Button

    ---創(chuàng)建文件QButton.h

#pragma once
#include "QWnd.h"
class QButton :
	public QWnd
{
public:
	QButton();
	~QButton();
public:
	BOOL CreateEx(
		LPCTSTR lpszWindowName,
		DWORD dwStyle,
		int x,
		int y,
		int nWidth,
		int nHeight,
		HWND hWndParent,
		HMENU nIDorHMenu
	);
};

    ---創(chuàng)建文件QButton.cpp

#include "QButton.h"



QButton::QButton()
{
}


QButton::~QButton()
{
}

BOOL QButton::CreateEx(
	LPCTSTR lpszWindowName,
	DWORD dwStyle,
	int x,
	int y,
	int nWidth,
	int nHeight,
	HWND hWndParent,
	HMENU nIDorHMenu
) {
	return QWnd::CreateEx(0, _T("BUTTON"), lpszWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, nIDorHMenu);
}

---創(chuàng)建QWnd的子類---QMainFrame

    ---創(chuàng)建QMainFrame.h文件

#pragma once
#include "QWnd.h"
#include "QButton.h"
class QMainFrame :
	public QWnd
{
public:
	QMainFrame();
	~QMainFrame();
public:
	LRESULT onClose(WPARAM wParam, LPARAM lParam);
	LRESULT onDestroy(WPARAM wParam, LPARAM lParam);
	virtual LRESULT onCreate(WPARAM wParam, LPARAM lParam);
public:
	QButton *m_wndButton;
};

   ---創(chuàng)建QMainFrame.cpp文件

#include "QMainFrame.h"
#define IDC_BUTTON 10001


QMainFrame::QMainFrame()
{
	m_wndButton = new QButton();
}


QMainFrame::~QMainFrame()
{
}

LRESULT QMainFrame::onClose(WPARAM wParam, LPARAM lParam) {
	return DestroyWindow();

}

LRESULT QMainFrame::onDestroy(WPARAM wParam, LPARAM lParam) {
	::PostQuitMessage(0);
	return true;
}
LRESULT QMainFrame::onCreate(WPARAM wParam, LPARAM lParam) {
	if (NULL == m_wndButton->m_hWnd) {
		m_wndButton->CreateEx(_T("www.itxuba.org"),WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,0,0,200,120,m_hWnd, (HMENU)IDC_BUTTON);
	}
	return TRUE;
}

---創(chuàng)建QWinApp的子類---QDemowinApp

   ---創(chuàng)建QDemowinApp.h文件

#pragma once
#include "QWinApp.h"
class QDemowinApp :
	public QWinApp
{
public:
	QDemowinApp();
	~QDemowinApp();
public:
	virtual BOOL InitInstance();
	virtual BOOL ExitInstance();
};
extern QDemowinApp theApp;

  

   ---創(chuàng)建QDemowinApp.cpp文件

#include "QDemowinApp.h"
#include "QMainFrame.h"

QDemowinApp::QDemowinApp()
{
}


QDemowinApp::~QDemowinApp()
{
}
QDemowinApp theApp;
BOOL QDemowinApp::InitInstance() {
	QMainFrame *pMainWnd = new QMainFrame();
	assert(pMainWnd);
	m_pMainWnd = pMainWnd;
	BOOL bRet = pMainWnd->CreateEx(0,_T("www.itxueba.org"),_T("www.itxueba.org"),WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL);
	if (!bRet) {
		MessageBox(NULL, _T("create window failed!"), _T("create window!"), 0);
	}
	pMainWnd->ShowWindow(SW_SHOW);
	pMainWnd->UpdateWindow();
	return true;
}
BOOL QDemowinApp::ExitInstance() {
	if (m_pMainWnd) {
		delete m_pMainWnd;
		m_pMainWnd = NULL;
	}
	return TRUE;
}

---創(chuàng)建入口程序

#include "QDemowinApp.h"
#include "QGlobal.h"
int WINAPI _tWinMain(
	IN HINSTANCE hInstance,
	IN HINSTANCE hPrevInstance,
	IN LPTSTR lpCmdLine,
	IN int nShowCmd
) {
	QWinApp* pWinApp = GlbGetApp();
	assert(pWinApp);
	pWinApp->InitInstance();
	pWinApp->run();
	pWinApp->ExitInstance();
	return TRUE;
}

本文名稱:win32學(xué)習(xí)之--------面向?qū)ο蟮拇翱陬惙庋b代碼記錄
網(wǎng)站網(wǎng)址:http://muchs.cn/article20/jojcco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、企業(yè)建站、電子商務(wù)、域名注冊(cè)網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作