第九章子窗口 The Button Class

多边形填充方式:ALTERNATE与WINDING的区别 见> 第五版 Charles Petzold,P139 刚看时,有点摸不着头脑.网上搜索看了些前辈的解释. 回头再看书本,发现其实Petzold大牛把这个问题解释简单明了,为何第一次看的时候居然入不了脑子? 完全按照书上写的来解释,如下: 1 Alternate 模式:  奇数填充,偶数不填充.        从一封闭区域内一个点画条射线到无穷远处, 碰到奇数条边 阅读详情

//---

注意 在创建子窗口时CreateWindow中的有个参数是用的 ((LPCREATESTRUCT) lParam)->hInstance, 

The instance handle parameter of the CreateWindow call looks a little strange, 
but we're taking advantage of the fact that during a WM_CREATE message lParam is 
actually a pointer to a structure of type CREATESTRUCT ("creation structure") 
that has a member hInstance. So we cast lParam into a pointer to a CREATESTRUCT structure and get hInstance out. 
  (Some Windows programs use a global variable named hInst to give window procedures access 
  to the instance handle available in WinMain. In WinMain, you need to simply set 
     hInst = hInstance ;   
before creating the main window. In the CHECKER3 program in Chapter 7, 
we used GetWindowLong to obtain this instance handle: 
GetWindowLong (hwnd, GWL_HINSTANCE)
  Any of these methods is fine.) 

在WM_CREATE消息中,lparam实际是 LPCREATESTRUCT指针.
该结构体的成员中就包含了应用程序的hInstance,以及常用的坐标(cy,cx,y,x)

  typedef struct tagCREATESTRUCTW {
  LPVOID      lpCreateParams;
  HINSTANCE   hInstance;
  HMENU       hMenu;
  HWND        hwndParent;
  int         cy;
  int         cx;
  int         y;
  int         x;
  LONG        style;
  LPCWSTR     lpszName;
  LPCWSTR     lpszClass;
  DWORD       dwExStyle;
  } CREATESTRUCTW, *LPCREATESTRUCTW;
  #ifdef UNICODE
  typedef CREATESTRUCTW CREATESTRUCT;
  typedef LPCREATESTRUCTW LPCREATESTRUCT;
  #else
  typedef CREATESTRUCTA CREATESTRUCT;
  typedef LPCREATESTRUCTA LPCREATESTRUCT;
  #endif // UNICODE
 */

//---


/*----------------------------------------
   BTNLOOK.C -- Button Look Program
                (c) Charles Petzold, 1998
  ----------------------------------------*/

#include <windows.h>

//button window styles and descriptive text strings for each of the 10 types of buttons. 
// After the CreateWindow call, we needn't do anything more with these child windows. 
//The button window procedure within Windows maintains the buttons for us and handles all repainting jobs. 
//(The exception is the button with the BS_OWNERDRAW style; as I'll discuss later, 
//this button style requires the program to draw the button.) 
struct
{
     int     iStyle ;
     TCHAR * szText ;
}
button[] =
{
     BS_PUSHBUTTON,      TEXT ("PUSHBUTTON"),
     BS_DEFPUSHBUTTON,   TEXT ("DEFPUSHBUTTON"),
     BS_CHECKBOX,        TEXT ("CHECKBOX"), 
     BS_AUTOCHECKBOX,    TEXT ("AUTOCHECKBOX"),
     BS_RADIOBUTTON,     TEXT ("RADIOBUTTON"),
     BS_3STATE,          TEXT ("3STATE"),
     BS_AUTO3STATE,      TEXT ("AUTO3STATE"),
     BS_GROUPBOX,        TEXT ("GROUPBOX"),
     BS_AUTORADIOBUTTON, TEXT ("AUTORADIOBUTTON"),
     BS_OWNERDRAW,       TEXT ("OWNERDRAW") // 这个button style 特别,它
} ;

#define NUM (sizeof button / sizeof button[0])

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("BtnLook") ;
     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 ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Button Look"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     while (GetMessage (&msg, NULL, 0, 0))
     {  
   TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HWND  hwndButton[NUM] ;
     static RECT  rect ;
     static TCHAR szTop[]    = TEXT ("message            wParam       lParam"),
                  szUnd[]    = TEXT ("_______            ______       ______"),
                  szFormat[] = TEXT ("%-16s%04X-%04X    %04X-%04X"),
                  szBuffer[50] ;
     static int   cxChar, cyChar ;
     HDC          hdc ;
     PAINTSTRUCT  ps ;
     int          i ;
     
     switch (message)
     {
     case WM_CREATE :
	//	 a function named GetDialogBaseUnits to obtain the width and height of the characters in the default font. 
    //The function returns a 32-bit value comprising a width in the low word and a height in the high word. 
   // GetTextMetrics function 也可以.
          cxChar = LOWORD (GetDialogBaseUnits ()) ; // width 
          cyChar = HIWORD (GetDialogBaseUnits ()) ; // height
          
          for (i = 0 ; i < NUM ; i++)
               hwndButton[i] = CreateWindow ( TEXT("button"), 
                                   button[i].szText,
                                   WS_CHILD | WS_VISIBLE | button[i].iStyle,
                                   cxChar, cyChar * (1 + 2 * i),
                                   20 * cxChar, 7 * cyChar / 4,
                                   hwnd, 
				  (HMENU) i, // 强制转换为菜单ID
                                   ((LPCREATESTRUCT) lParam)->hInstance, 
								   NULL
								   ) ;
          return 0 ;

     case WM_SIZE :
          rect.left   = 24 * cxChar ; // 24个cxChar的宽度的位置
          rect.top    =  2 * cyChar ; // 高
          rect.right  = LOWORD (lParam) ;
          rect.bottom = HIWORD (lParam) ;
          return 0 ;

     case WM_PAINT :
          InvalidateRect (hwnd, &rect, TRUE) ;
          
          hdc = BeginPaint (hwnd, &ps) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          SetBkMode (hdc, TRANSPARENT) ;
          
          TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
          TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
          
          EndPaint (hwnd, &ps) ;
          return 0 ;
          
     case WM_DRAWITEM :
     case WM_COMMAND :
		 /*
		   在WM_COMMAND消息中, wParam,lParam中包含的数据如下
		   LOWORD (wParam) : Child window ID 
		   HIWORD (wParam): Notification code 
		   lParam: Child window handle 
		   
			 
			   Button Notification Code Identifier ----  Value 
			   BN_CLICKED: 0 
			   BN_PAINT: 1 
			   BN_HILITE or BN_PUSHED: 2 
			   BN_UNHILITE or BN_UNPUSHED: 3 
			   BN_DISABLE:4 
			   BN_DOUBLECLICKED or BN_DBLCLK: 5 
			   BN_SETFOCUS: 6 
			   BN_KILLFOCUS: 7 			   

		  */
			// 滚动窗口
          ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
          
          hdc = GetDC (hwnd) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          
          TextOut (hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
                   szBuffer,
                   wsprintf (szBuffer, szFormat,
                         message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") : 
                                                  TEXT ("WM_COMMAND"),
                         HIWORD (wParam), LOWORD (wParam),
                         HIWORD (lParam), LOWORD (lParam))) ;
          
          ReleaseDC (hwnd, hdc) ;
          ValidateRect (hwnd, &rect) ;
          break ;
          
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


UOS系统手动添加1920x1080分辨率:xrandr命令详解与持久化配置 本文详细介绍了在UOS系统中使用xrandr命令手动添加1920x1080分辨率的方法。针对系统设置中缺失该选项的常见问题,文章提供了从识别显示设备、使用cvt生成模式、添加并切换分辨率,到通过修改.profile文件实现持久化配置的完整步骤。同时涵盖了虚拟机环境、设备名识别及排错等进阶内容,帮助用户彻底解决UOS分辨率配置难题。 阅读详情

相关推荐

【SPI-NAND】Linux驱动移植实战:从规格书解析到内核适配

本文详细解析了SPI-NAND Flash的Linux驱动移植实战,从规格书关键参数提取到内核MTD子系统适配。内容涵盖存储结构解析、命令集映射、设备树配置及厂商驱动开发,特别强调ECC校验、坏块管理等NAND特性处理,并提供了性能优化与测试验证的实用技巧。

weixin_27076351的博客 351

Qt开发入门:从零到跨平台GUI低手

Qt开发入门:从零到跨平台GUI低手

Yusei_0523的博客 598

Spark入门:从零到能跑的实战教程

Spark 的强大在于它统一了大数据处理的多种场景,从批处理到流处理,从 SQL 到机器学习。对于初学者来说,理解 Spark 的核心理念——内存计算和分布式抽象,是最重要的一步。接着,学会用 PySpark 搭建环境,能读数据、能写 SQL,基本上就入门了。剩下的路,就是通过实战去加深理解。写到这里,相信你对 Spark 已经有了一个比较完整的认识。下一步,不妨自己动手写几个 PySpark 脚本,跑一跑日志数据,或者尝试用 Spark SQL 做一个统计。

Morpheon的博客 1371

黑马程序员Pink老师2025版HTML部分学习笔记

本文是HTML5零基础入门课程的笔记总结,涵盖从开发工具到表单交互的全流程知识。主要内容包括: 开发准备:推荐使用AI编辑器Trae和Chrome浏览器,配置LiveServer等插件 HTML基础:文档结构、标签语法(标题/段落/图片/链接等)、路径概念 语义化标签:强调使用strong/em等语义化标签而非纯样式标签 核心元素:图像/音视频/列表/表格的标签写法与属性 表单交互:表单容器、输入控件类型及属性设置 课程强调建立"语义化思维",推荐通过查看网页源码实践学习,为后续CSS学

2303_79635409的博客 406

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

科研党必备:Python脚本批量下载DOI文献的保姆级教程(附避坑指南)

本文为科研人员提供了一份详细的Python脚本批量下载DOI文献的教程,涵盖环境配置、核心功能实现、性能优化及常见问题解决。通过自动化脚本,研究者可高效完成文献批量下载,显著提升科研工作效率,特别适合需要处理大量文献的研究团队使用。

weixin_26965807的博客 477

Windows 鸿蒙 PC 应用开发:Electron 桌面级电子书阅读器开发实战指南

摘要:本文详细介绍了在HarmonyOS PC环境下基于Electron框架开发桌面应用的全流程,重点以电子书阅读器为例,涵盖环境搭建、项目架构设计、核心模块实现及关键技术方案。文章首先解析了鸿蒙Electron工程目录结构(包含lib.unstripped调试库与ohos_hap壳工程),详细说明DevEco Studio配置调试签名、USB连接真机调试的完整步骤。随后展示电子书阅读器项目如何将Web技术栈(HTML5/CSS3/JavaScript)与Electron结合,通过LocalStorage实

Dream_Y.ocean的博客 1万+

【Python计量】linearmodels面板数据回归(一)

我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。

mfsdmlove的博客 9277

JavaScript 从入门到实战:Web 开发第一语言完全教程

JavaScript 从入门到实战:Web 开发第一语言完全教程

夏老师讲鸿蒙 226

在 SAP S/4HANA 的 BP 事务里做保存前校验:BDT 事件、BUPA_FURTHER_CHECKS 与 CVI 扩展 BAdI 一次讲透

SAP BP事务保存前校验机制解析 摘要:本文系统梳理了SAP BP事务保存前的校验机制,揭示了三种关键校验点的差异与适用场景: BDT框架DCHCK事件:最靠近UI层,适合屏幕字段级校验,但API调用时可能失效 Classic BAdI BUPA_FURTHER_CHECKS:全局拦截点,可阻断整个BP保存,适合核心业务规则 CVI扩展校验:仅管控供应商/客户段落,需注意可能产生"BP已保存但段落未保存"的情况 文章通过真实案例(如黑名单校验、付款冻结等)展示了各校验点的最佳实践,并特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 311

Qt软件开发-Qt编译zlib完成文件压缩解压(win10)

在软件开发中进行有需求需要将生成的一些文件打包上传到服务器,或者从服务器下载压缩包下来内部解压。或者自己做一些打包工具,那么使用zlib开源就可以很方便的完成。接下来介绍在zlib在windows下如何利用Qt进行编译,调用,介绍mingw、msvc,32/64位编译办法,完成zip文件打包生成例子。可以单文件压缩打包,多文件压缩打包,目录压缩打包等等。

2217

Vue 完整版系统知识文档

《Vue全栈开发实战手册》摘要 本手册系统整合Vue2/Vue3全栈知识体系,涵盖基础语法、组件开发、状态管理、工程化等核心内容,适合从入门到精通的完整学习路径。主要特点: 基础核心 详解MVVM架构和响应式原理(Vue2的Object.defineProperty vs Vue3的Proxy) 完整模板语法规则与16种内置指令解析 组件系统核心:通信机制(8种方案)、插槽、动态组件、递归组件 进阶实战 状态管理:Vuex/Pinia完整解决方案 路由开发:动态路由、权限控制、懒加载 工程化:Webpack

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 402

【NVMEM子系统】二、NVMEM驱动框架

该子系统整体架构不算太大,还是比较容易去理解的,下面我们一起去一探究竟!,该子系统主要用于实现EEPROMEfuse等非易失存储器的统一管理。在早期,像EEPROM驱动是存放于目录下,由于没有做到好的抽象,每次需要去访问相应内存空间,都需要去复制几乎一样的代码,去注册sysfs,这是一个相当大的抽象泄露。NVMEM子系统就是为了解决以往的抽象泄露问题。

Donge's Blog 1715

VC6.0补丁Vs6sp6安装方法

VC6.0经常在编译或链接的时候就卡死,只有通过任务栏管理器来结束任务,非常麻烦. 我不知道我的VC6.0是英文版还是中文版,反正我的界面是英文的(有些软件的界面可以换语言) 我估计我的是英文版,所下载了个英文版的补丁安装了. vc sp6 中英文补丁下载地址 英文版地址: http://download.microsoft.com/download/1/9/f/19fe4660-

-----------------------------不要在跟自己无关的事情上浪费时间 3万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINDOWS API,CreateWindowW,WM_KEYDOWN,VK_ESCAPE, SendMessage(hwnd, WM_CLOSE, 0, 0)

[cpp] view plaincopy #include       LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

-----------------------------不要在跟自己无关的事情上浪费时间 2103

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

GDI -Rectangle

#include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASSW wc = {0

-----------------------------不要在跟自己无关的事情上浪费时间 2067

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows 程序设计 第四章 sysmets2

/*---------------------------------------------------- SYSMETS2.C -- System Metrics Display Program No. 2 (c) Charles Petzold, 1998 -------------------------------------------

-----------------------------不要在跟自己无关的事情上浪费时间 1559

巧妙位运算合并坐标2个数x,y,结果作为子窗口ID,当求坐标时再拆开ID得到坐标(x,y)

//  计算结果是25个子窗口的ID,即idFocus   hwnd, (HMENU) (y   // 现在要把idFocus拆开得到 x,y            x = idFocus & 0xFF ;           y = idFocus >> 8 ; #include int main(int argc, char *argv[]) { int

-----------------------------不要在跟自己无关的事情上浪费时间 1557

GDI-Pen

#include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void DrawLines(HWND); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { MSG ms

-----------------------------不要在跟自己无关的事情上浪费时间 1320

windows API -- WinMain,WndProc,Msg, CreateWindow ......

windows 窗口结构体 原型,10个字段     typedef struct _WNDCLASS {          UINT       style;          WNDPROC    lpfnWndProc;          int        cbClsExtra;          int        cbWndExtra;          HINSTAN

-----------------------------不要在跟自己无关的事情上浪费时间 1264

windows程序设计--鼠标消息---程序击中测试

Windows程序设计 第五版 Charles PetZold  P232 /*------------------------------------------------- CHECKER1.C -- Mouse Hit-Test Demo Program No. 1 (c) Charles Petzold, 1998 --------

-----------------------------不要在跟自己无关的事情上浪费时间 1203

Windows程序设计第九章子窗口控件--自绘按钮

Windows程序设计第九章子窗口控件--自绘按钮 P300 - 305 /*---------------------------------------- OWNDRAW.C -- Owner-Draw Button Demo Program (c) Charles Petzold, 1996 -----------------------

-----------------------------不要在跟自己无关的事情上浪费时间 1177

windows程序设计编辑类 edit

Windows程序设计 编辑类EDIT  P315  --- /*---------------------------------------- POPPAD1.C -- Popup Editor using child window edit box (c) Charles Petzold, 1998 ----------------------

-----------------------------不要在跟自己无关的事情上浪费时间 1173

Windows程序设计 第十章 菜单资源类文件

VC比较起来确实不如Delphi方便,Delphi真正的所见即所得,直接就是窗口上摆弄各种菜单等. VC要设计菜单资源类文件.rc ,可以在文本文档中设计菜单资源类文件.rc Windows程序设计 第五版 Charles PetZold  第十章,P350--P358 /*-----------------------------------------

-----------------------------不要在跟自己无关的事情上浪费时间 1148

Window Class Styles 与 Window Styles

在创建窗口前必须先定义一个窗口内结构体并注册(RegisterClass(&wc);) WNDCLASS wc={0}; 这个WNDCLASS有一个成员是 Window Class Styles http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx 这个sytle决定了将来要创建

-----------------------------不要在跟自己无关的事情上浪费时间 1140

怎么样取消博客图片加水印的功能?

http://bbs.youkuaiyun.com/topics/390497854?page=1#post-394870196

-----------------------------不要在跟自己无关的事情上浪费时间 1103
上一篇: 巧妙位运算合并坐标2个数x,y,结果作为子窗口ID,当求坐标时再拆开ID得到坐标(x,y)
下一篇: 关于字符集和Unicode的相关知识
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值