Windows 程序设计
一、Win32 API
/********************************************************************
created: 2014/04/14 15:30
filename: WinMain.c
author: Justme0 (http://blog.csdn.net/justme0) purpose: Win32 API
*********************************************************************/ #include <windows.h>
#include <string.h> WCHAR *strText = L"请单击本窗口用户区"; /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
PAINTSTRUCT ps;
HDC hdc; switch (message) {
case WM_LBUTTONDOWN:
strText = L"Hello, world!";
InvalidateRect(hWindow, NULL, );
break; case WM_PAINT:
hdc = BeginPaint(hWindow, &ps); TextOut(hdc, , , strText, wcslen(strText));
EndPaint(hWindow, &ps);
break; case WM_DESTROY:
PostQuitMessage();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} /*
** 注册窗口,该窗口的名字是 wndName
*/
ATOM Register(HINSTANCE hInstance, WCHAR *wndName) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = wndName;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
HWND Create(HINSTANCE hInstance, WCHAR *lpszClassName) {
return CreateWindow(
lpszClassName,
L"My Window",
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd = NULL; // 窗口句柄
WCHAR wndName[] = L"Window_ClassName"; // 窗口名 Register(hInstance, wndName);
hWnd = Create(hInstance, wndName);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return Run();
}
二、OO模拟MFC
/********************************************************************
created: 2014/04/14 20:37
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: Windows程序设计,用 OO 模拟 MFC
*********************************************************************/ #include <Windows.h> WCHAR *strText = L"请单击本窗口用户区"; /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
PAINTSTRUCT ps;
HDC hdc; switch (message) {
case WM_LBUTTONDOWN:
strText = L"Hello, world!";
InvalidateRect(hWindow, NULL, );
break; case WM_PAINT:
hdc = BeginPaint(hWindow, &ps); TextOut(hdc, , , strText, wcslen(strText));
EndPaint(hWindow, &ps);
break; case WM_DESTROY:
PostQuitMessage();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} /*
** 窗体类
*/
class CFrameWnd {
protected:
HWND hWnd; public:
CFrameWnd() : hWnd(NULL) {} /*
** 注册窗口,该窗口的名字是 className
*/
ATOM Register(HINSTANCE hInstance, WCHAR *className) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = className;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
void Create(HINSTANCE hInstance, WCHAR *className, WCHAR *wndName) {
this->hWnd = CreateWindow(
className,
wndName,
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} void ShowWindow(int nCmdShow) {
::ShowWindow(this->hWnd, nCmdShow);
} void UpdateWindow() {
::UpdateWindow(this->hWnd);
}
}; /*
** `应用程序类
*/
class CWinApp {
protected:
CFrameWnd * m_pMainWnd; public:
CWinApp() : m_pMainWnd(NULL) {} virtual void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"我的窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} virtual ~CWinApp() {
delete m_pMainWnd;
} }; class CWinAppDerived : public CWinApp {
public:
void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"用新的 InitInstance 函数的程序"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
}
}; int APIENTRY WinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd)
{
CWinApp myApp; // 或 CWinAppDerived myApp;
myApp.InitInstance(hInstance, nShowCmd); return myApp.Run();
}


三、消息处理函数的简单封装
/********************************************************************
created: 2014/04/14 20:37
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: Windows程序设计,用 OO 模拟 MFC
*********************************************************************/ #include <Windows.h> class CWinApp;
class CWinAppDerived;
CWinApp * AfxGetApp();
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam); WCHAR *gText = L"请单击本窗口用户区"; /*
** 具有处理消息的类
*/
class CCmdTarget {
protected:
HWND hWnd; public:
CCmdTarget() : hWnd(NULL) {} /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK AfxWndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
switch (message) {
case WM_LBUTTONDOWN:
this->OnLButtonDown();
break; case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWindow, &ps);
this->OnDraw(hdc);
EndPaint(hWindow, &ps);
break; } case WM_DESTROY:
this->OnDestroy();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} virtual void OnLButtonDown() {} virtual void OnDestroy() {
::PostQuitMessage();
} void OnDraw(HDC hdc) {
TextOut(hdc, , , gText, wcslen(gText));
}
}; /*
** 窗体类
*/
class CFrameWnd : public CCmdTarget {
public:
/*
** 注册窗口,该窗口的名字是 className
*/
ATOM Register(HINSTANCE hInstance, WCHAR *className) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = className;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
void Create(HINSTANCE hInstance, WCHAR *className, WCHAR *wndName) {
this->hWnd = CreateWindow(
className,
wndName,
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} void ShowWindow(int nCmdShow) {
::ShowWindow(this->hWnd, nCmdShow);
} void UpdateWindow() {
::UpdateWindow(this->hWnd);
}
}; class CFrameWndDerived : public CFrameWnd {
void OnLButtonDown() {
gText = L"重新定义的消息处理";
InvalidateRect(this->hWnd, NULL, );
}
}; /*
** `应用程序类
*/
class CWinApp {
public:
CFrameWnd *m_pMainWnd;
CWinApp *m_pSelfApp; public:
CWinApp() : m_pMainWnd(NULL) {
m_pSelfApp = this; // 不能直接初始化
} virtual void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"CWinApp窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} virtual ~CWinApp() {
delete m_pMainWnd;
} friend CWinApp * AfxGetApp();
}; /*
** 派生的窗体类
*/
class CWinAppDerived : public CWinApp {
public:
void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWndDerived; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"CWinAppDerived窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
}
}; LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
CWinApp * pApp = AfxGetApp();
return pApp->m_pMainWnd->AfxWndProc(hWindow, message, wParam, IParam);
} CWinAppDerived g_myAppDerived; CWinApp * AfxGetApp() {
return g_myAppDerived.m_pSelfApp;
} int APIENTRY WinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd)
{
CWinApp *pCWinApp = AfxGetApp();
pCWinApp->InitInstance(hInstance, nShowCmd); return pCWinApp->Run();
}
运行结果


四、用 MFC 设计的含有消息映射的 Windows 应用程序
/********************************************************************
created: 2014/04/16 22:08
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: 用 MFC 设计的含有消息映射的 Windows 应用程序 注:在“项目设置”中选择使用 MFC 类库(动态、静态皆可)
*********************************************************************/ #define _WIN32_WINNT 0x0502 #include <afxwin.h> class CFrameWndDerived : public CFrameWnd {
private:
WCHAR *showText; public:
CFrameWndDerived() : showText(L"初始化的字符串") {} afx_msg void OnPaint() {
CPaintDC dc(this);
dc.TextOut(, , showText);
} afx_msg void OnLButtonDown(UINT, CPoint) { // 这个参数表针对 VS 编译器
showText = L"有消息映射表的程序";
InvalidateRect(NULL, TRUE);
} DECLARE_MESSAGE_MAP();
}; BEGIN_MESSAGE_MAP(CFrameWndDerived, CFrameWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP() /*
** 派生的窗体类
*/
class CWinAppDerived : public CWinApp {
public:
BOOL InitInstance() {
CFrameWndDerived *pMainWndDerived = new CFrameWndDerived;
pMainWndDerived->Create(NULL, L"MFC");
pMainWndDerived->ShowWindow(m_nCmdShow);
pMainWndDerived->UpdateWindow();
m_pMainWnd = pMainWndDerived; return TRUE;
}
}; CWinAppDerived MyApp; // 实在费解,程序中哪里引用到了这个全局变量?怎么检测到这个全局变量的?


Windows 程序设计的更多相关文章
- 关于《Windows程序设计(第五版)》中一个实例程序的疑问
最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...
- windows 程序设计自学:添加图标资源
#include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...
- windows程序设计笔记
2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...
- 《Windows程序设计第5版》学习进度备忘
书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...
- MFC Windows程序设计源代码免费下载
本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...
- windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释
看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE); // 系统默认 ...
- windows程序设计简介
大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...
- 愉快的开始 - Windows程序设计(SDK)000
愉快的开始 让编程改变世界 Change the world by program 参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张) 学习环境 视频演示:W ...
- Windows程序设计学习笔记(一)Windows内存管理初步
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...
随机推荐
- SQL语句Where中使用别名作为判断条件
当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件. 例如下面的SQL语句: select id, (c1 + c2) as s from t1 where ...
- Partitioning & Archiving tables in SQL Server (Part 1: The basics)
Reference: http://blogs.msdn.com/b/felixmar/archive/2011/02/14/partitioning-amp-archiving-tables-in- ...
- autoit小贴士
如何防止程序重复运行? #include <Misc.au3>_Singleton("test") 如何删除脚本程序自身? ;删除脚本程序自身 Run(@ComSpec ...
- gulp使用笔记
gulp简介 gulp 是基于 Nodejs 的自动任务运行器,能自动化地完成javascript/coffee/sass/less/html/image/css等文件的的测试.检查.合并.压缩.格式 ...
- jenkins:通过execute shell启动的进程会被杀死的问题
[问题]在jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat,但是无法启动tomcat,虽然构建会显示执行成功,但是查看 ...
- PAT 02-线性结构1 两个有序链表序列的合并 (15分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个递增的整数序列. 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: typedef ...
- 用HttpWebRequest提交带验证码的网站
using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using Syst ...
- HEX文件格式和其校验算法
这次我将在原来的基础上(http://www.cnblogs.com/libra13179/p/5787084.html)继续讲解HEX文件的格式 打开app_valid_setting_apply. ...
- WPF的二维绘图(一)——DrawingContext
DrawingContext比较类似WinForm中的Graphics 类,是基础的绘图对象,用于绘制各种图形,它主要API有如下几种: 绘图API 绘图API一般形为DrawingXXX系列,常用的 ...
- http请求的开销
很多人都说要减少http请求,可关注为什么要减少请求的人却少很多,本文是对我在几篇博客以及知乎上看到的内容的整理. http请求头的数据量 每次请求都会带上一些额外的信息进行传输,当请求的资源很小,比 ...