19windows_19_OwnerDraw自制按钮DIYBUTTON

  1. #include <windows.h>
  2. #include <iostream>
  3. CHAR szText[256] = { 0 };
  4. #define PrintLog(x) WriteConsole(g_hStdout, x, strlen(x), NULL, NULL)
  5. HINSTANCE g_hInst = NULL; //窗口句柄
  6. HANDLE g_hStdout = NULL; //控制台句柄
  7. void OnCreate(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  8. {
  9. CreateWindow("BUTTON", "DIY按钮",
  10. WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
  11. 50, 50, 200, 50, hWnd, (HMENU)1001, g_hInst, NULL);
  12. CreateWindow("BUTTON", "普通按钮", WS_VISIBLE | WS_CHILD,
  13. 400, 50, 200, 50, hWnd, NULL, g_hInst, NULL);
  14. }
  15. void OnDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
  16. {
  17. LPDRAWITEMSTRUCT pDis = (LPDRAWITEMSTRUCT)lParam;
  18. if (ODT_BUTTON == pDis->CtlType)
  19. {
  20. if (pDis->itemState & ODS_SELECTED)
  21. {
  22. //使用画刷
  23. //1、创建 2、交换 3、销毁
  24. HBRUSH hBrush = CreateSolidBrush(RGB(200, 200, 255));
  25. HBRUSH hOldBrush = (HBRUSH )SelectObject(pDis->hDC, hBrush);
  26. RoundRect(pDis->hDC, pDis->rcItem.left,
  27. pDis->rcItem.top, pDis->rcItem.right,
  28. pDis->rcItem.bottom,15,15);
  29. SelectObject(pDis->hDC, hOldBrush);
  30. DeleteObject(hOldBrush);
  31. }
  32. else
  33. {
  34. HBRUSH hBrush = CreateSolidBrush(RGB(100, 100, 255));
  35. HBRUSH hOldBrush = (HBRUSH)SelectObject(pDis->hDC, hBrush);
  36. RoundRect(pDis->hDC, pDis->rcItem.left,
  37. pDis->rcItem.top, pDis->rcItem.right,
  38. pDis->rcItem.bottom, 15, 15);
  39. SelectObject(pDis->hDC, hOldBrush);
  40. DeleteObject(hOldBrush);
  41. }
  42. //绘制按扭
  43. /*Rectangle(pDis->hDC, pDis->rcItem.left,
  44. pDis->rcItem.top, pDis->rcItem.right,
  45. pDis->rcItem.bottom);*/
  46. //绘制圆角按扭
  47. /*RoundRect(pDis->hDC, pDis->rcItem.left,
  48. pDis->rcItem.top, pDis->rcItem.right,
  49. pDis->rcItem.bottom,15,15);*/
  50. GetWindowText(pDis->hwndItem, szText, 256);
  51. //绘制按钮文字名称
  52. int nOldMode = SetBkMode(pDis->hDC, TRANSPARENT);//去文字背景色
  53. DrawText(pDis->hDC, szText, strlen(szText), &pDis->rcItem,
  54. DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  55. SetBkMode(pDis->hDC, nOldMode);//在给设置回来
  56. }
  57. }
  58. void OnMeasureitem(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  59. {
  60. LPMEASUREITEMSTRUCT pMis = (LPMEASUREITEMSTRUCT)lParam;
  61. pMis->itemHeight = 200;
  62. }
  63. LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  64. {
  65. switch (nMsg)
  66. {
  67. case WM_CREATE:
  68. OnCreate(hWnd,nMsg,wParam,lParam);
  69. break;
  70. case WM_DRAWITEM:
  71. OnDrawItem(hWnd, wParam, lParam);
  72. return 0;
  73. case WM_MEASUREITEM: //使用这项,这项对于BUTTON没有影响,但对COMBOBOXLIST有影响
  74. OnMeasureitem(hWnd,nMsg,wParam,lParam);
  75. break;
  76. case WM_DESTROY:
  77. PostQuitMessage(0);
  78. break;
  79. }
  80. return DefWindowProc(hWnd, nMsg, wParam, lParam);
  81. }
  82. BOOL RegisterWnd(LPSTR pszClassName)
  83. {
  84. WNDCLASSEX wce = { 0 };
  85. wce.cbSize = sizeof(wce);
  86. wce.cbClsExtra = 0;
  87. wce.cbWndExtra = 0;
  88. wce.hbrBackground = HBRUSH(COLOR_BTNFACE + 1);
  89. wce.hCursor = NULL;
  90. wce.hIcon = NULL;
  91. wce.hIconSm = NULL;
  92. wce.hInstance = g_hInst;
  93. wce.lpfnWndProc = WndProc;
  94. wce.lpszClassName = pszClassName;
  95. wce.lpszMenuName = NULL;
  96. wce.style = CS_HREDRAW | CS_VREDRAW;
  97. ATOM atom = RegisterClassEx(&wce);
  98. if (atom == NULL)
  99. {
  100. return FALSE;
  101. }
  102. else
  103. {
  104. return TRUE;
  105. }
  106. }
  107. HWND CreateWnd(LPSTR pszClassName)
  108. {
  109. HWND hWnd = CreateWindowEx(0, pszClassName, "灭天", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  110. CW_USEDEFAULT, NULL, NULL, g_hInst, 0);
  111. return hWnd;
  112. }
  113. void ShowWnd(HWND hWnd)
  114. {
  115. ShowWindow(hWnd, SW_SHOW);
  116. UpdateWindow(hWnd);
  117. }
  118. void Msg()
  119. {
  120. MSG msg = { 0 };
  121. while (GetMessage(&msg, NULL, 0, 0))
  122. {
  123. TranslateMessage(&msg);
  124. DispatchMessage(&msg);
  125. }
  126. }
  127. void ConsoleWnd()
  128. {
  129. AllocConsole();
  130. g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  131. CHAR szText[] = "Debug start:\n";
  132. WriteConsole(g_hStdout, szText, strlen(szText), NULL, NULL);
  133. }
  134. int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
  135. {
  136. g_hInst = hInstance;
  137. //ConsoleWnd();
  138. RegisterWnd("oooo");
  139. HWND hWnd = CreateWnd("oooo");
  140. ShowWnd(hWnd);
  141. Msg();
  142. return 0;
  143. }

来自为知笔记(Wiz)

时间: 2024-10-20 01:16:47

19windows_19_OwnerDraw自制按钮DIYBUTTON的相关文章

小白自制按钮切换滚动的走马灯幻灯片脚本

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

自制按钮图标的两种方法: image sprite和svg字体文件

用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具,可以上传自己的SVG格式的图标文件,也可以从其中选择已有的图标, 定制出自己的字体文件.下载的结果包括了字体文件和一个简单的demo.html, (https://icomoon.io/app/#/select), (类似工具: https://glyphter.com) 二.用 image spr

自己动手做按钮

现在网上发布的自制按钮很多,实际上其制作方法都很类似,以下给出几个关键步骤,具体细节你大可以发挥你的想象力,制作出你想要的各种按钮. 一.用ClassWizard生成一个新类,名字假设起为CMyButton,基类选为CButton: 二.在新类中用ClassWizard添加函数:PreSubclassWindow().DrawItem().OnMouseMove().OnLButtonDown().OnLButtonUp(): ① PreSubclassWindow()函数在绘制按钮前执行,在这

NGUI全面实践教程(大学霸内部资料)

NGUI全面实践教程(大学霸内部资料)   试读文档下载地址:链接:http://pan.baidu.com/s/1jGosC9g 密码:8jq5 介绍:NGUI全面实践教程(大学霸内部资料)本书是国内NGUI最新教程,以全新的3.8.0为基础,讲解NGUI的使用.内容不仅全面该函NGUI的各个组件,还详细讲解各项高级功能,以及自带工具. 目  录 第1章  学习NGUI前的准备 1 1.1  NGUI的购买/下载和导入 1 1.1.1  找到并了解NGUI的相关信息 1 1.1.2  导入NG

自制Unity小游戏TankHero-2D(3)开始玩起来

自制Unity小游戏TankHero-2D(3)开始玩起来 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的.仅为学习Unity之用.图片大部分是自己画的,少数是从网上搜来的.您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码. 本篇主要记录金币.按钮.坦克工厂.小地图等小部件,让整个场景初步成为一个可玩的游戏. 在本篇在制作过程中,

《30天自制操作系统》读书笔记(4) 绘图

暑假果然是滋生懒散的温床. (╯‵□′)╯︵┻━┻ 好久不动都忘记之前做到哪里了, 上次好像做到了C语言的引入, 这一节所做的东西都相当轻松, 将会绘制出操作系统的基本界面. 绘图的原理 按照书中所说, 将值写入到显存中就能在屏幕上显示相应的像素, 在asmhead.nas 中有这一段: 1 CYLS EQU 0x0ff0 ; 设定启动区 2 LEDS EQU 0x0ff1 3 VMODE EQU 0x0ff2 ; 关于颜色数目的信息,颜色的位数 4 SCRNX EQU 0x0ff4 ; 分辨率

《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的装载地址 5 6 ; 以下这段是标准FAT32格式软盘专用的代码 7 8 JMP entry 9 DB 0x90 10 DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(8字节) 11 DW 512 ; 每个扇区(sector)的大小(必须为512字节)

自制Javascript分页插件,支持AJAX加载和URL带参跳转两种初始化方式,可用于同一页面的多个分页和不同页面的调用

闲话部分 最近闲着实在无聊,就做了点小东西练练手,由于原来一直在用AspNetPager进行分页,而且也进行了深度的定制与原有系统整合的也不错,不过毕竟是用别人的,想着看自己能试着做出来不能,后台的分页插件已经有比较成熟的了,那就自己试着写一个前台分页吧. 话不多说,先上效果图: 优点与缺点 来说说优缺点吧,首先AspNetPager是后台分页控件,所以在向客户端回传HTML文档之前生成HTML阶段 就会把分页代码生成完毕,然后回传,而JS是前端代码,就是HTML文档在服务器组织完毕往客户端传送

[Unity3D]自制UnityForAndroid二维码扫描插件

一周左右最终将二维码生成和扫描功能给实现了,最终能舒缓一口气了,从一開始的疑惑为啥不同的扫码client为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分析出来事实上二维码无非就是记录了一个简单的信息,通常是URL,然后自己在URL上面做文章!得知了需求之后然后開始着手做二维码的生成,用了开源框架QRCode,然后解析ZXing,都是站在前人的肩膀上继续做下去,我就没有深入研究二维码的深层次方面的东西,大概仅仅知道生成是依据一个二维Bool数组