用VC MFC有一段时间了,总觉得还没掌握到精髓,项目代码基本是拼凑起来的。总是少点什么。前段时间,看完 快乐鹦鹉 的程序人生, 里面提到 全局变量 的一段。突然想到自己用 vc+opencv的一个小项目, 那里面真可谓 全局变量满天飞啊,只要是mat 的变量都成了全局变量,方便访问。总觉得自己以前写程序,纯属为写而写, 只要能达到目标,怎么直接怎么来,很是野蛮的方式。对写程序缺乏一个系统的研究,基础不牢固。很有必要,系统的看看相关书籍了。

1、注册窗口类时,类的名称不能重复,当前面已经注册了一个名字的类(lpszClassName),后面的窗口类就不能再用这个名字了。

以下代码用 szAppName[] 及szAppName1[] 放置两个类名字符串,若szAppName1[] 的内容与szAppName[]一样时,在第二次注册时不会成功,由GetLastError()的返回值是1410 可以到 〖1410〗-类别已存在。

#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND         hwnd ;MSG          msg ;WNDCLASS     wndclass ;wndclass.style         = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc   = WndProc ;wndclass.cbClsExtra    = 0 ;wndclass.cbWndExtra    = 0 ;wndclass.hInstance     = hInstance ;wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName  = NULL ;wndclass.lpszClassName = szAppName ;static TCHAR szAppName1[] = TEXT("HelloWin");HWND         hwnd1;WNDCLASS     wndclass1;wndclass1.style = CS_HREDRAW | CS_VREDRAW;wndclass1.lpfnWndProc = WndProc;wndclass1.cbClsExtra = 0;wndclass1.cbWndExtra = 0;wndclass1.hInstance = hInstance;wndclass1.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass1.hCursor = LoadCursor(NULL, IDC_WAIT);wndclass1.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);wndclass1.lpszMenuName = NULL;wndclass1.lpszClassName = szAppName1;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}if (!RegisterClass(&wndclass1)){GetLastError();MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName1, MB_ICONERROR);return 0;}hwnd = CreateWindow (szAppName,                  // window class nameTEXT ("The Hello Program"), // window captionWS_OVERLAPPEDWINDOW,        // window styleCW_USEDEFAULT,              // initial x positionCW_USEDEFAULT,              // initial y positionCW_USEDEFAULT,              // initial x sizeCW_USEDEFAULT,              // initial y sizeNULL,                       // parent window handleNULL,                       // window menu handlehInstance,                  // program instance handleNULL) ;                     // creation parametersShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;hwnd1 = CreateWindow(szAppName1,                  // window class nameTEXT("The Hello Program1"), // window captionWS_OVERLAPPEDWINDOW,        // window styleCW_USEDEFAULT,              // initial x positionCW_USEDEFAULT,              // initial y positionCW_USEDEFAULT,              // initial x sizeCW_USEDEFAULT,              // initial y sizeNULL,                       // parent window handleNULL,                       // window menu handlehInstance,                  // program instance handleNULL);                     // creation parametersShowWindow(hwnd1, iCmdShow);UpdateWindow(hwnd1);while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC         hdc ;PAINTSTRUCT ps ;RECT        rect ;switch (message){case WM_CREATE:PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;TextOut(hdc, 0, 0, _T("您好!测试一下数量"), 9);DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;case WM_LBUTTONDOWN:PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);return 0;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}

2、上述程序TextOut(hdc,0,0,_T("您好!测试下数量"),9) 针对函数TextOut的试验。

a、TextOut并不认为字符串尾部值为0字节表示字符串的结束,它利用iLength参数来决定字符串的长度,把9该大时将会出现乱码

b、去掉_T() ,也是出现乱码,  unicode双字节字符串。

c、确定打印个数时,可以使用 lstrlen() 获得;

3、消息中处理的变量,若是有连续性或其他地方需要使用,该变量应声明为静态变量。因为消息结束时,消息中的变量也会随之释放,将上面的回调函数改为:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC         hdc ;PAINTSTRUCT ps ;RECT        rect ;TCHAR szAppName[] = TEXT("大王叫我来寻山!");static int lButtonDownTimes = 0;int rButtonDownTimes = 0;static TCHAR timesDown[100];static TCHAR timesRDown[100];switch (message){case WM_CREATE:PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;TextOut(hdc, 0, 0, timesDown, 10);TextOut(hdc, 0, 10, timesRDown, 10);DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;case WM_LBUTTONDOWN:wsprintf(timesDown, _T("左键按下次数:%d"), lButtonDownTimes);InvalidateRect(hwnd,NULL,TRUE);lButtonDownTimes++;return 0;case WM_RBUTTONDOWN:wsprintf(timesRDown, _T("右键按下次数:%d"), rButtonDownTimes);InvalidateRect(hwnd, NULL, TRUE);rButtonDownTimes++;return 0;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}

分别点击鼠标左键和右键能清楚的看到 局部变量 和全局变量的影响。

上述函数在鼠标点击的消息内,调用了 InvalidateRect(hwnd,NULL,TRUE)使得整个窗口无效,InvalidateRect函数会生成WM_PAINT消息。

关于第5章P107对 TextOut的使用

TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer,
    wsprintf (szBuffer, TEXT ("%5d"),GetDeviceCaps (hdc, devcaps[i].iIndex))) ;


wsprintf 函数的返回值就是字符串的长度。
												

windows程序设计读书笔记一相关推荐

  1. MFC Windows程序设计 读书笔记2

    Windows中负责图形输出的是Graphics Device Interface(图形设备接口),或称GDI.本节主要讲述CDC类和它的继承类,并介绍三种最常用的GDI基本元素,画笔.画刷.和字体, ...

  2. Windows程序设计 读书笔记(3)

    第三章 窗口与消息 3.1 窗口的创建 用户对窗口的输入以'消息'的形式传递给窗口,而窗口也借助消息来与其他窗口进行通信.例如当用户改变窗口的尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相 ...

  3. windows程序设计读书笔记四

    前面的程序碰到刷新时碰到闪烁问题,百度一搜,一堆关于双缓冲解决闪烁的文章. 具体实施方案为: 1.建立一个内存DC hdcMem = CreateCompatibleDC(hdc); 此时,内存DC的 ...

  4. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  5. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  6. PHP程序设计读书笔记七

    一.比较字符串: 1."=="和"==="的区别: "=="在比较之前会先把非字符串类型的操作数转换成字符串,所以"3" ...

  7. 电子数据取证Windows取证读书笔记

    电子数据取证第六章Windows取证读书笔记 其实Windows的取证可以依靠像美亚的取证大师这类取证软件来进行. 这类软件可以完成大多数的取证需要 用户目录: WindowsXP----Docume ...

  8. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) 1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc ...

  9. c语言程序设计读书笔记3000字,C语言程序设计读书笔记题目

    读书笔记注意事项: 1. 读书笔记要求至少有六个题目,在一类.二类.三类题目中各选两题,具体题目选择由学生自行选择. 2. 每个题目必须包含所选题目,以及具体题目的程序实现过程,要求每行语句后都需要有 ...

最新文章

  1. 十一运夺金基础数据采集工具
  2. python linux编程与window编程_Python实现Windows和Linux之间互相传输文件(文件夹)的方法...
  3. MySQL下载与配置
  4. usaco2.1.2(frac1)
  5. 基因分子生物学~tRNA,mRNA,蛋白质合成
  6. C++将类的构造函数、析构函数声明为private或者protected的用途
  7. mysql log_来吧,了解下mysql有哪些log
  8. android端和javaWeb端实现Mqtt消息推送
  9. 如何才能成为高级Java开发工程师
  10. Python爬虫爬取微博热搜保存为 Markdown 文件
  11. Vue进阶之表单控件绑定
  12. vgg19-dcbb9e9d.pth文件网盘下载
  13. 软考信息安全工程师知识总结
  14. MCU程序布局----优化升级方式
  15. 手动档科目三考试过程
  16. 什么叫手机或设备的ID
  17. JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?
  18. 工艺角(process corner)
  19. 【4天快速入门Python数据挖掘之第1天】Matplotlib的使用
  20. 公司职员信息管理系统

热门文章

  1. SpringCloud系列(3)---Netfilx-Ribbon
  2. C++算法集锦:动态规划(一)
  3. Revit二开:控制视图的细线模式
  4. VLC学习笔记(1): 概述
  5. 太赞了!华为工程师总结了400道前端面试题
  6. 我懒蛋又回来了!-PDO
  7. 一行python代码画粑粑_如何阅读《JavaScript高级程序设计》(一)
  8. java实践11之网络IO BIO和NIO(上)
  9. day05 【异常、线程】
  10. 国内云计算的下半场机遇在哪里?