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

windows编程学习之路--自绘按钮 // DrawButton.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "DrawButton.h" #pragma comment(lib,"Msimg32.lib") #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTi 阅读详情


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

P300 - 305

/*----------------------------------------
   OWNDRAW.C -- Owner-Draw Button Demo Program
                (c) Charles Petzold, 1996
  ----------------------------------------*/

#include <windows.h>

#define ID_SMALLER      1
#define ID_LARGER       2
#define BTN_WIDTH        (8 * cxChar)
#define BTN_HEIGHT       (4 * cyChar)

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

HINSTANCE hInst ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("OwnDraw") ;
     MSG          msg ;
     HWND         hwnd ;
     WNDCLASS     wndclass ;
     
     hInst = hInstance ;
     
     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  = szAppName ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Owner-Draw Button Demo"),
                          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 ;
}

void Triangle (HDC hdc, POINT pt[])
{
     SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
     Polygon (hdc, pt, 3) ;
     SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HWND      hwndSmaller, hwndLarger ;
     static int       cxClient, cyClient, cxChar, cyChar ;
     int              cx, cy ;
     LPDRAWITEMSTRUCT pdis ;
     POINT            pt[3] ;
     RECT             rc ;
     
     switch (message)
     {
     case WM_CREATE :
          cxChar = LOWORD (GetDialogBaseUnits ()) ;
          cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
               // Create the owner-draw pushbuttons 窗口第一次显示时 这2个button都位于客户区左上角(0,0)....	
		       //  把WM_SIZE 屏蔽掉,就可以发现button在右上角了.
		      // WM_SIZE 是如何,什么时候参数的?
          hwndSmaller = CreateWindow (TEXT ("button"), TEXT (""),
                                      WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                                      0, 0, BTN_WIDTH, BTN_HEIGHT,
                                      hwnd, (HMENU) ID_SMALLER, hInst, NULL) ;
          
          hwndLarger  = CreateWindow (TEXT ("button"), TEXT (""),
                                      WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                                      0, 0, BTN_WIDTH, BTN_HEIGHT,
                                      hwnd, (HMENU) ID_LARGER, hInst, NULL) ;
          return 0 ;


//WM_SIZE 当主窗口的客户区部分大小改变时,我们的应用程序将接收到 WM_SIZE 消息。
//当然该窗口第一次显示时,我们也将接收到该消息		  
     case WM_SIZE : 		
          cxClient = LOWORD (lParam);
          cyClient = HIWORD (lParam);

               // Move the buttons to the new center 移动buttons到指定位置.
       /*   
          MoveWindow (hwndSmaller, cxClient / 2 - 3 * BTN_WIDTH  / 2,
                                  cyClient / 2 -     BTN_HEIGHT / 2,
                      BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          MoveWindow (hwndLarger,  cxClient / 2 +     BTN_WIDTH  / 2,
                                   cyClient / 2 -     BTN_HEIGHT / 2,
                      BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          return 0 ;
		 */ 
          
     case WM_COMMAND :

//	  GetWindowRect to store the position and size 
//	 of the entire window (not only the client area) in a RECT (rectangle) structure
//  This position is relative to the screen

          GetWindowRect (hwnd, &rc) ;
          
               // Make the window 10% smaller or larger
          
          switch (wParam)
          {
          case ID_SMALLER :
               rc.left   += cxClient / 20 ;
               rc.right  -= cxClient / 20 ;
               rc.top    += cyClient / 20 ;
               rc.bottom -= cyClient / 20 ;
               break ;
               
          case ID_LARGER :
               rc.left   -= cxClient / 20 ;
               rc.right  += cxClient / 20 ;
               rc.top    -= cyClient / 20 ;
               rc.bottom += cyClient / 20 ;
               break ;
          }
          
          MoveWindow (hwnd, rc.left, rc.top, rc.right  - rc.left,
                            rc.bottom - rc.top, TRUE) ;
          return 0 ;
          
     case WM_DRAWITEM :
          pdis = (LPDRAWITEMSTRUCT) lParam ;
               
               // Fill area with white and frame it black
               
          FillRect (pdis->hDC, &pdis->rcItem,
                    (HBRUSH) GetStockObject (WHITE_BRUSH)) ;
               
          FrameRect (pdis->hDC, &pdis->rcItem,
                     (HBRUSH) GetStockObject (BLACK_BRUSH)) ;

               // Draw inward and outward black triangles
          cx = pdis->rcItem.right  - pdis->rcItem.left ;
          cy = pdis->rcItem.bottom - pdis->rcItem.top  ;

          switch (pdis->CtlID)
          {
          case ID_SMALLER :
               pt[0].x = 3 * cx / 8 ;  pt[0].y = 1 * cy / 8 ;
               pt[1].x = 5 * cx / 8 ;  pt[1].y = 1 * cy / 8 ;
               pt[2].x = 4 * cx / 8 ;  pt[2].y = 3 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
                    
               pt[0].x = 7 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               pt[1].x = 7 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               pt[2].x = 5 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
                    
               pt[0].x = 5 * cx / 8 ;  pt[0].y = 7 * cy / 8 ;
               pt[1].x = 3 * cx / 8 ;  pt[1].y = 7 * cy / 8 ;
               pt[2].x = 4 * cx / 8 ;  pt[2].y = 5 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
                    
               pt[0].x = 1 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               pt[1].x = 1 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               pt[2].x = 3 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
               break ;
                    
          case ID_LARGER :
               pt[0].x = 5 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               pt[1].x = 3 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               pt[2].x = 4 * cx / 8 ;  pt[2].y = 1 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
                    
               pt[0].x = 5 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               pt[1].x = 5 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               pt[2].x = 7 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
               pt[0].x = 3 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               pt[1].x = 5 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               pt[2].x = 4 * cx / 8 ;  pt[2].y = 7 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
               pt[0].x = 3 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               pt[1].x = 3 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               pt[2].x = 1 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               Triangle (pdis->hDC, pt) ;
               break ;
          }
               
               // Invert the rectangle if the button is selected
               
          if (pdis->itemState & ODS_SELECTED)
               InvertRect (pdis->hDC, &pdis->rcItem) ;
               
               // Draw a focus rectangle if the button has the focus
               
          if (pdis->itemState & ODS_FOCUS)
          {
               pdis->rcItem.left   += cx / 16 ;
               pdis->rcItem.top    += cy / 16 ;
               pdis->rcItem.right  -= cx / 16 ;
               pdis->rcItem.bottom -= cy / 16 ;
                    
               DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
          }
          return 0 ;
               
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


//



C语言 Windows程序设计,使用GDI自绘按钮、编辑框、贴图小练习 C语言 Windows程序设计,使用GDI自绘按钮,编辑框,贴图小练习。 这些雕虫小技,在VB里面不知道有多少的简单。 在这里用C语言来写,是这么麻烦,这么麻烦。 真不知道有什么好处? 正事不干,专们喜欢干这种鸟事,可怜我以前想干这种鸟 事,都觉得自己无从下手,多少年过去,重新开始学C语言 的,才发现,一切都是这么的简单,如果不是VB让我学会 了程序设计,我也不会觉得C语言也是这么普通的好用。 还是C语言好,C++我什么时候才能动手学呢。。。。 可以开始学了吧。。。 控件都学过了,GDI也会画表格了,会贴图片了。 还有什么要学呢。。 还要学注册表,数据库、文件、通讯。。。。 还是先学STL标准库,有了这个东西,写程序会方便点。 立即下载

相关推荐

VB做的Panel控件

用VB模仿Delphi中的Panel控件做的一个小控件, 有源码,想学VB自绘控件的可以下载学习一下.

win32创建窗口及按钮(轻量级)

win32,窗口,按钮

Think88666的博客 3200

vb.net 自定义控件(含自定义对话框设置属性) 实例

vb.net 自定义控件 自定义属性 UITypeEditor UI 类型编辑器 实例 提供一个示例 UITypeEditor,它使用 IWindowsFormsEditorService 显示用于用户输入的 Form。 IWindowsFormsEditorService 只能通过 PropertyGrid 控件的 GetService 方法使用。 此服务通常用于显示来自 UITypeEditor 的 EditValue 方法的窗体。当 PropertyGrid 调用 UITypeEditor 的 EditValue 方法来提供用于编辑属性值的用户界面时,会将对 IServiceProvider 的引用传递给 EditValue 方法,IServiceProvider 通常可提供 IWindowsFormsEditorService 的实例。此服务的方法可用于显示对话框和窗体,或者用于在下拉容器内显示 Control,该容器显示在当前正在编辑的值字段区域附近的属性网格的顶部。 为 UITypeEditor 提供一个接口,用于显示 Windows 窗体,或者在设计模式下在属性网格控件的下拉区域中显示控件。 注意一个问题:设计模式与生成dll文件加载显示结果不同,这就是为什么会在设计模式时运行显示灰色,不能跳出自定义对话框,只有在生成文件加载才显示。

《Windows程序设计》读书笔九 子窗口控件

第九章 子窗口控件

sesiria的博客 6660

子窗口按钮父窗口响应

1)在子窗口里面增加一个signal,在父窗口里面增加一个响应slot用于接收这个信号。 2)子窗口的按钮slot函数中emit这个signal。 3)在父窗口中把子窗口的这个signal连到自己的响应slot。

vb自绘界面(完全用line命令绘制界面)

完全用vb自带的line命令绘制的界面,兴趣来了随手写的,只写了窗体和按钮。可以自己添加其他功能 :)全部用line实现,简单易懂。

Windows程序设计 学习笔记 第九章 子窗口控件

Win32 控件

苹果好吃呀的博客 2996

自绘窗体风格,完全可以让你由此做出漂亮的窗口界面

程序实现了对Window窗口的绘制,改变默认的窗口风格。 程序在功能上和普通的窗体是完全一样的,有正常的系统菜单、边框及标题栏,为了体现自定义绘制,我把标题栏上的三个系统按钮使用了三个矩形代替,当然程序的边框、标题栏,系统铵钮等可以完全由自己来定义。主要代码都在主窗体上,而主窗体CPP文件总共656行,不多吧。但我没有上传代码,先看看程序运行的效果再说!

Windows第九章 控件的介绍

这样其他组的单选按钮不受影响,如果不分组,那其他地方的单选和这里的所有只能选一个。没有进行每个的区分,如果要对它进行代码上的改动,就要重设一下ID。相当于combobox点下拉按钮后下面的那部分,显示一条一条的项。单选控件如果要分组,就要点一下第一个单选按钮,设置一下组。如果需要在分页上添加其他控件,只要在分页对话框上添加即可。这里我直接使用关联变量,关联变量的知识在第十章有介绍。想要在tab的分页上显示对话框,需要先创建对话框资源。在数据里添加项的显示,每个项用分号分开。

yerennuo的博客 913

工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

目录1. imu 校准1.1 IMU型号1.2 坐标定义1.2.1 大地坐标系(WGS84)1.2.2 当地地理坐标系(ENU)1.2.3 传感器坐标轴定义1.3 传感器校准2. 底盘车辆参数配置3. 单激光雷达校准参考文献 1. imu 校准 1.1 IMU型号 阅读IMU产品说明书,获得如下信息: Yesense YIS300 系列惯性传感系统 YIS300 系列包含: YIS300-U 惯性测量单元(IMU):输出经过校准的加速度和角速度值,同时也能够输出磁场强度信息。 YIS300-V 垂直参考系

穿林需独行的博客 4203

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 378

Windows界面UI自绘编程(上)之下部

Windows界面编程系列课程(中)第七章 进程 第七章 进程

zhaopeng01zp的博客 2318

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码)

本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。

pp12345的博客 429

第九章 子窗口控件part1

hwndParent = GetParent(hwnd);子窗口消息处理程序能确定其父窗口的窗口句柄,hwnd是子窗口的窗口句柄.如果想在您的电子表格程序的某个角落放置一个标有「Recalculate」的按钮,那么您可以通过呼叫CreateWindow来建立这个按钮。。要做的只是拦截WM_COMMAND消息-当按钮被按下时,它通过这一消息通知您的窗口消息处理程序。9.1按钮类别#inc

千月星跡 1213

基于51单片机扫地机器人(全套Proteus仿真+原理图+程序+说明书)

(内含源程序代码,原理图,仿真,讲解视频,元件清单等,【精品】值得推荐!!!扫地机器人是以单片机为主控制器。通过单片机控制小车行驶、除尘、蜂鸣。扫地机器人使用双电机驱动,以提高整车运动的平稳性;在智能车进驶过程中,采用双超声波模块实现避障。

2301_76434107的博客 1895

threekingdoms.txt中文三国演义下载及实现人物出场统计

threekingdoms.txt全文下载:https://python123.io/resources/pye/threekingdoms.txt CalThreeKingdomsV1.py: #CalThreeKingdomsV1.py import jieba txt = open("threekingdoms.txt", "r", encoding = "utf-8").read() words = jieba.lcut(txt) counts = {} for word in words:

ZYYRWish_97的博客 1万+

第九章 子窗口控件(静态类别,滚动条类别)

<br />静态类别<br />在CreateWindow函数中指定窗口类别为「static」,您就可以建立静态文字的子窗口控件。这些子窗口非常「文静」。它既不接收鼠标或键盘输入,也不向父窗口发送WM_COMMAND消息。<br />当您在静态子窗口上移动或者按下鼠标时,这个子窗口将拦截WM_NCHITTEST消息并将HTTRANSPARENT的值传回给Windows,这将使Windows向其下层窗口,通常是它的父窗口,发送相同的WM_NCHITTEST消息。父窗口常常将该消息传递给DefWindowPro

厦门 程序人生 895

UDF学习(二)基础数据类型与常见宏

thread_loop_c (t,d) 必须与begin_c_loop (c,t)同时使用,但begin_c_loop (c,t)不一定与thread_loop_c (t,d)同时使用。同理thread_loop_f(t,d)必须与begin_f_loop (c,t)同时使用,但begin_f_loop (c,t)不一定与thread_loop_f(t,d)同时使用。begin_c_loop (c,t) 在计算域内对网格单元进行循环。c_face_loop (c,t)遍历网格单元上的所有网格面。

weixin_44386973的博客 855

第九章子窗口 The Button Class

//--- 注意 在创建子窗口时CreateWindow中的有个参数是用的 ((LPCREATESTRUCT) lParam)->hInstance,  The instance handle parameter of the CreateWindow call looks a little strange,  but we're taking advantage of the

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

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 313

Programming Windows程式开发设计指南->第九章 例子程序1

/*_############################################################################  _##   _##  Programming Windows程式开发设计指南->第九章 例子程序1  _##  Author: xwlee                           _##  Time: 2007.07.03  

网络空间安全与企业信息化 1082

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c语言中是窗口停留,一、Windows模态对话框—Tab停留和分组

在第九章,我们利用窗口子类别化为COLORS1增加功能,使我们能够按下Tab键从一个滚动条转移到另一个滚动条。在对话框中,窗口子类别化是不必要的,因为Windows完成了将输入焦点从一个控件移动到另一个控件的所有工作。尽管如此,您必须在对话框模板中使用WS_TABSTOP和WS_GROUP窗口样式达到此目的。对于所有想要使用Tab键存取的控件,都要在其窗口样式中指定WS_TABSTOP。如果参阅表...

weixin_32367173的博客 652

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

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Windows编程基础 第九章 对话框 静态框 按钮 文本编辑框

// windows13.cpp : 定义应用程序的入口点。 // //本程序用来演示坐标映射和字体 #include "windows13.h" #include "stdafx.h" #include "resource.h" #include "stdio.h" #include "windows.h" HINSTANCE g_hInst=NULL; BOOL CALLBACK Di

学峰的学习笔记 1443

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

第九章: Windows编程

  Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用Windows API 函数。尽管如此,如果遇到特殊情况,VCL 又不支持,Delphi程序员还得直接面对Windows编程。不过只有在极其特殊的情况下,例如:基于不寻常API 调用的Delphi...

weixin_30550081的博客 85

C++ Windows 编程(一)

由于对各个领域产生了巨大影响,应用开发获得了巨大的流行度。在这个蓬勃发展的市场中,拥有正确的一套工具对于使开发者能够构建实用、用户友好且高效的应用程序至关重要。本书专注于 Small Windows 的使用和实现,这是一个简化交互式 Windows 应用程序开发的 C++面向对象类库。本书的目的在于学习如何在 Windows 中开发应用程序。为了做到这一点,我开发了 Small Windows,这是一个用于 Windows 图形应用程序的 C++ 面向对象类库。

龙哥盟 510
上一篇: 关于字符集和Unicode的相关知识
下一篇: Windows程序设计 滚动条
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值