一、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 程序设计的更多相关文章

  1. 关于《Windows程序设计(第五版)》中一个实例程序的疑问

    最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...

  2. windows 程序设计自学:添加图标资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  3. windows程序设计笔记

    2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...

  4. 《Windows程序设计第5版》学习进度备忘

    书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...

  5. MFC Windows程序设计源代码免费下载

    本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...

  6. windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释

    看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE);  // 系统默认 ...

  7. windows程序设计简介

    大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...

  8. 愉快的开始 - Windows程序设计(SDK)000

    愉快的开始 让编程改变世界 Change the world by program  参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张)  学习环境 视频演示:W ...

  9. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

随机推荐

  1. mysql常用单行函数

    一.大小写控制函数 LOWER(str)    将str的值全部置为小写字母 select LOWER('ABC'); --结果: LOWER('ABC') abc UPPER(str)    将st ...

  2. UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

  3. Android 调用系统联系人界面的添加联系人,添加已有联系人,编辑和修改。

    一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("cont ...

  4. git笔记 常规使用

    1. 创建分支    git checkout -b fetch_name 2. 添加快照进行登记 git add . 3.登记到仓库 git commit -m 'message' git comm ...

  5. ansible playbook 示例

    http://blog.keshi.org/hogememo/2015/12/07/exploiting-ansible-jinja2 http://blog.keshi.org/hogememo/2 ...

  6. MySQL之权限管理

    MySQL之权限管理 一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作, 那么你就不能执行update操作.只 ...

  7. php工作笔记4-mysql笔记1

    1.Mysql中数值的长度和最大值是没有关系的,它仅仅只代表了数据的宽度,比如:int(4)和int(8)可以存储的数据长度是一样的,她两的大小都是4Byte, 在存储上数据的时候比如Int(4) | ...

  8. tp框架总结(四)

    一 ajax的返回 调用实例: $this->ajaxReturn(返回数据,提示信息,操作状态); $this->ajaxReturn(返回数据,‘json’); js: <scr ...

  9. 将Linux命令的结果作为下一个命令的参数

    查询所有的pid并杀死. jps -l | grep bdcsc2-native-demo | awk '{print $1}' | xargs kill -9 KISS:keep it short ...

  10. Exynos 4412 Uboot源码解析

    原文地址:http://www.cnblogs.com/jacklu/p/6226330.html Exynos 4412 Uboot的汇编代码就不贴了,没有的可以私信我. 这是我当时阅读代码时的思维 ...