1. #include <windows.h>
  2. #include <strsafe.h>
  3. /*
  4. 任务:去掉标题栏和边框
  5. */
  6.  
  7. //#define LineHeight 15 这是自己猜测的行高,不要这样做
  8.  
  9. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  10.  
  11. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  12. {
  13. static TCHAR szClassName[] = TEXT("MyWindows2");
  14. HWND hwnd;
  15. MSG msg;
  16.  
  17. //注册一个窗口类
  18. //注册窗口类
  19. WNDCLASS wndclass;
  20.  
  21. wndclass.hInstance = hInstance;
  22. wndclass.lpszClassName = szClassName;
  23. wndclass.cbClsExtra = ;
  24. wndclass.cbWndExtra = ;
  25. wndclass.lpfnWndProc = WndProc;
  26. wndclass.lpszMenuName = NULL;
  27. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  28. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  29. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  30. wndclass.style = CS_HREDRAW;
  31.  
  32. if (!RegisterClass(&wndclass))
  33. {
  34. MessageBox(NULL, L"Error", L"Error", MB_ICONERROR);
  35. return ;
  36. }
  37.  
  38. //创建窗口
  39. hwnd = CreateWindow(
  40. szClassName,
  41. TEXT("MyFirstPractice"),
  42. //方法一
  43. //WS_OVERLAPPEDWINDOW &~WS_CAPTION &~WS_SYSMENU &~WS_SIZEBOX,
  44. WS_OVERLAPPEDWINDOW,
  45. CW_USEDEFAULT,
  46. CW_USEDEFAULT,
  47. CW_USEDEFAULT,
  48. CW_USEDEFAULT,
  49. NULL,
  50. NULL,
  51. hInstance,
  52. NULL
  53. );
  54.  
  55. ShowWindow(hwnd, nShowCmd);
  56. UpdateWindow(hwnd);
  57.  
  58. while (GetMessage(&msg, NULL, , ))
  59. {
  60. TranslateMessage(&msg);
  61.  
  62. //此处分发消息,调用消息回调函数,
  63. //同时消息回调函数的返回值作为DIspatchMessage的返回值返回,
  64. //一般讲这个返回值忽略
  65. DispatchMessage(&msg);
  66. /*
  67. The return value specifies the value returned by the window procedure. Although its meaning depends on the message being dispatched, the return value generally is ignored.
  68. 返回值指定窗口过程返回的值。尽管它的含义依赖于发送的消息,但是返回值通常被忽略。
  69. */
  70. }
  71.  
  72. return msg.wParam;
  73. }
  74.  
  75. /*
  76. WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

  77. typedef struct tagMSG {
  78. HWND hwnd;
  79. UINT message;
  80. WPARAM wParam;
  81. LPARAM lParam;
  82. DWORD time;
  83. POINT pt;
  84. } MSG, *PMSG;
  85. 前四个参数一致
  86.  
  87. 操作系统直接使用msg前四位作为参数传入窗口回调函数
  88. */
  89.  
  90. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  91. {
  92. HDC hdc;
  93. PAINTSTRUCT ps;
  94. RECT rect;
  95.  
  96. TCHAR szBuffer[];
  97. size_t iTarget;
  98. TEXTMETRIC tm;
  99. static int cxChar, cyChar;
  100.  
  101. switch (message)
  102. {
  103. case WM_CREATE:
  104. //在创建时就设置为静态全局变量,在后面的消息触发是就可以直接使用了
  105. hdc = GetDC(hwnd);
  106.  
  107. //获得当前字体的尺寸
  108. GetTextMetrics(hdc,&tm);
  109. //系统获取行距等信息,不要自己猜测
  110. cxChar = tm.tmAveCharWidth;
  111. cyChar = tm.tmHeight + tm.tmExternalLeading;
  112.  
  113. ReleaseDC(hwnd,hdc);
  114. case WM_SIZE:
  115. ; LONG_PTR s = GetWindowLongPtr(hwnd, GWL_STYLE);
  116. //s = s &~WS_CAPTION &~WS_SYSMENU&~WS_SIZEBOX;
  117. s = s&~WS_SIZEBOX;
  118. SetWindowLongPtr(hwnd,GWL_STYLE, s);
  119. break;
  120. case WM_LBUTTONDOWN:
  121. if (IDYES == MessageBox(NULL, L"Are you sure to quit?", L"Info", MB_YESNO)){
  122. PostQuitMessage();
  123. }
  124. break;
  125. case WM_NCLBUTTONUP:
  126. MessageBox(NULL, L"Clicked on Not client Area", L"Info", NULL);
  127. break;
  128. case WM_PAINT:
  129. hdc = BeginPaint(hwnd, &ps);
  130. GetClientRect(hwnd, &rect);
  131. //SetTextAlign(hdc, GetTextAlign(hdc) | TA_CENTER);
  132. int i = ;
  133. for (; i < ;i++)
  134. {
  135. //使用安全的字符串方法,防止溢出等原因
  136. StringCchPrintf(szBuffer, , TEXT("%d: %s"),i+,TEXT("I love C++"));
  137. //wsprintf(szBuffer, TEXT("%d: %s"),i+1, TEXT("I love C++"));
  138.  
  139. StringCchLength(szBuffer, , &iTarget);
  140. //取代了lstrlen
  141. //TextOut(hdc, 0,i*LineHeight, szBuffer, lstrlen(szBuffer));
  142. TextOut(hdc, cxChar, i*cyChar, szBuffer, iTarget);
  143.  
  144. }
  145. //TextOut(hdc, 400, 300, L"this is my second program", 20);
  146. //DrawText(hdc, L"this is my second program", -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  147. EndPaint(hwnd, &ps);
  148. break;
  149. case WM_CLOSE:
  150. if (IDYES == MessageBox(NULL, L"Are you sure to quit?", L"Info", MB_YESNO))
  151. {
  152. DestroyWindow(hwnd);
  153. }
  154. break;
  155. case WM_DESTROY:
  156. MessageBox(NULL, L"GUI is close,deal sql before quit", L"Info", MB_OK);
  157. PostQuitMessage();
  158. break;
  159. case WM_QUIT:
  160. break;
  161. default:
  162. return DefWindowProc(hwnd, message, wParam, lParam);
  163. }
  164. return ;
  165. }

学习windows编程 day1的更多相关文章

  1. 有一定基础的 C++ 学习者该怎样学习 Windows 编程?

    人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...

  2. 我为什么学习Windows编程

    前一段时间在看TCP/IP,在图书馆里面找了不少的书,其中有几本书还是不错的.比如: <Windows网络与通信程序设计(第二版)> 王艳平著 <WinSock网络编程经络> ...

  3. 学习windows编程 day2 之滚动条使用

    相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时W ...

  4. 学习windows编程 day6 之处理鼠标移动

    #define POINT_MAX 1000 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara ...

  5. 学习windows编程 day4 之 绘制随机矩形和peekMessage

    #include <windows.h> #include <strsafe.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT messa ...

  6. 学习windows编程 day4 之 自定义映射

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  7. 学习windows编程 day4 之视口和窗口

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  8. 学习windows编程 day4 之 盯裆猫

    写着写着就困了.... 看这些测量数据就算了,是对各种函数的练习 #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT ...

  9. 学习windows编程 day4 之 多边矩形填充

    #include <windows.h> #include <math.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, ...

随机推荐

  1. SpringMVC视图解析器概述

    不论控制器返回一个String,ModelAndView,View都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转. 控制器处理方法---->ModelAndV ...

  2. Filter学习:项目第八阶段

      public interface Filter A filter is an object that performs filtering tasks on either the request ...

  3. Java Script正则表达式语法学习

    今天在做页面交互验证时,在HTML里面第一反应居然用了Java 处理正则表达式的语法... ---------------------------------题记 学习来源 http://www.ru ...

  4. python 中的列表(list)

    一.生成一个列表 直接生成 L1 = [1, 2, 3, 4, 5] 列表解析式 >>> L2 = [x for x in range(1, 10, 2)] #从1到10的迭代,步长 ...

  5. js原生常用事件event

    onblur 元素失去焦点: onchange用户改变域的内容: onclick鼠标点击对象: onerror当加载图片时发生错误: onfocus 元素获得焦点: onkeypress某个键盘的键被 ...

  6. 求两个整数的最大公约数GCM

    思路分析: (1)求差判定法:  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...

  7. 数字证书签发,授权等相关以及https建立通信过程

    一直以来都对数字证书的签发,以及信任等事情一知半解.总算有个闲适的周末来总结和深入一下相关的知识. CA: CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的 ...

  8. 关于supervisor 的使用以及配置

    首先我个人认为,用python实现的supervisor使用了守护进程这个概念去实现一个包裹进程的概念. 他可以帮助你的进程完成失效重启,日志记录,确保在线,关机自启动等一系列的功能. 当使用supe ...

  9. js數組

    數組對象創建: var a=new Array(); var b=new Array(1); var a=new Array(“AA“,”AA“): 相關函數: sort()排序,可以進行字面上排序s ...

  10. Java之使用HttpClient发送GET请求

    package LoadRunner; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import o ...