当前位置: 首页 > 编程日记 > 正文

win32的一个售票程序,收获有非常的多

先秀一下我的收获吧!

1、在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框;或者不这么做也行,就是在对话框属性visiable设置为true;

2、hdc变量最好在函数内初始化,别将它直接传入函数;

3、WM_SIZE的wParam参数很有用;

4、关于movewindow

MoveWindow sends the WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.

5、WM_WINDOWPOSCHANGED消息的lParam参数只向一个WINDOWPOS结构体的指针,所以我们可以利用这个指针时刻调整我们的窗口位置或者大小,很有用,

wndpos = (LPWINDOWPOS)lParam;

6、获取对话框内的控件id也因getdlgitem()变的很方便,还有一个getdlgitemid()也很方便;

7、WM_CTLCOLORDLG消息不详细解释啦,直接看msdn:

The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors using the specified display device context handle.

直接上代码了,功能还不是很完善的,算法也算简单,作为一个win32的初学者,也有那么一点点的成就感。

#include <windows.h>
#include "resource.h"#define CLSNAME "Ticket"
#define WNDNAME "售票系统"#define XGAP cxChar*5
#define YGAP cyCharstatic int cxChar,cyChar;
BOOL bDraw[8][7]={0};
HWND iBtnFirst;
WNDPROC BTNPROC[8][7];
HWND hwndOption;
static BOOL bShine;void Draw(HWND parent,HWND btn,BOOL flag);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK BtnProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
INT_PTR CALLBACK OptionProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam
);int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR clsname[] = TEXT(CLSNAME);WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WindowProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1);wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = clsname ;if(!::RegisterClass(&wndclass)){MessageBox ( NULL, TEXT ("This program requires Windows NT!"),clsname, MB_ICONERROR) ;return 0 ;}HWND hwnd;hwnd = ::CreateWindow(clsname,TEXT(WNDNAME),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);::ShowWindow(hwnd,SW_SHOW);::UpdateWindow(hwnd);hwndOption = ::CreateDialog(hInstance,TEXT("OPTION"),hwnd,OptionProc);::ShowWindow(hwndOption,SW_SHOW);MSG msg;while(::GetMessage(&msg,NULL,0,0)){::TranslateMessage(&msg);::DispatchMessage(&msg);}return msg.wParam;
}void Draw(HWND parent,HWND btn,BOOL flag)
{HDC hdc;RECT rect;HBRUSH hBrush;POINT a;POINT b;hdc = ::GetDC(parent);::GetWindowRect(btn,&rect);a.x = rect.right;a.y = rect.top;b.x = rect.right;b.y = rect.bottom;::ScreenToClient(parent,&a);::ScreenToClient(parent,&b);if(flag){hBrush = ::CreateSolidBrush(RGB(255,0,0));::SetWindowText(btn,TEXT("座位售出"));}else {hBrush = ::CreateSolidBrush(RGB(128,255,128));}::SelectObject(hdc,hBrush);::Ellipse(hdc,a.x,a.y,b.x+XGAP,b.y);::ReleaseDC(parent,hdc);
}LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;int i,j;RECT rect;static HWND hwndBtn[8][7];static BOOL bFlag[8][7];static HBRUSH hBrush;static int iRow,iCol,iBtn;TCHAR szBuffer[9];static WINDOWPOS  * wndpos;int mvX,mvY,mvCx,mvCy;int iOptionAdult,iOptionChild;switch(uMsg){case	WM_CREATE:cxChar = LOWORD(::GetDialogBaseUnits());cyChar = HIWORD(::GetDialogBaseUnits());for(i=0;i<8;i++)for(j=0;j<7;j++){			hwndBtn[i][j] = ::CreateWindow(TEXT("button"),TEXT("未售出"),WS_CHILD|WS_VISIBLE,XGAP*(j+1)+cxChar*9*j,YGAP*(i+1)+cyChar*7/4*i,cxChar*9,cyChar*7/4,hwnd,HMENU(i*10+j),NULL,NULL);::wsprintf(szBuffer,TEXT("%d行%d座"),i+1,j+1);::SetWindowText(hwndBtn[i][j],szBuffer);}return 0;case WM_SIZE:if(wParam!=SIZE_MINIMIZED||wParam!=SIZE_RESTORED){mvX = (::GetSystemMetrics(SM_CXSCREEN)-(cxChar*9*7+9*XGAP))/2;mvY = 	(::GetSystemMetrics(SM_CYSCREEN)-(cyChar*7/4*8+11*YGAP))/2;mvCx = cxChar*9*7+9*XGAP;mvCy = cyChar*7/4*8+11*YGAP+YGAP*2;::MoveWindow(hwnd,mvX,mvY,mvCx,mvCy,false);::GetWindowRect(hwndOption,&rect);::MoveWindow(hwndOption,mvX,mvY+rect.bottom-rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE);}return 0;case WM_WINDOWPOSCHANGED:wndpos = (LPWINDOWPOS)lParam;::GetWindowRect(hwndOption,&rect);::MoveWindow(hwndOption,wndpos->x,wndpos->y+wndpos->cy,rect.right-rect.left,rect.bottom-rect.top,TRUE);return 0;case WM_COMMAND:iBtn = ::GetWindowLong((HWND)lParam,GWL_ID);iRow = iBtn / 10;iCol = iBtn % 10;iOptionAdult = (int)::SendMessage(::GetDlgItem(hwndOption,IDC_ADULT),BM_GETCHECK,0,0);iOptionChild = (int)::SendMessage(::GetDlgItem(hwndOption,IDC_CHILD),BM_GETCHECK,0,0);if(!iOptionAdult&&!iOptionChild){::MessageBox(hwnd,TEXT("请标记售票类型!"),TEXT("提示"),MB_OK|MB_ICONEXCLAMATION);::SetFocus(hwndOption);return 0;}if(!bDraw[iRow][iCol]&&HIWORD(wParam) == BN_CLICKED){bDraw[iRow][iCol] = TRUE;::Draw(hwnd,(HWND)lParam,TRUE);::SetFocus(hwnd);		::SendMessage(hwndOption,WM_COMMAND,1,1);return 0;}break;//后来才发现这个消息只适用于自绘按钮/*case WM_CTLCOLORBTN:if((HWND)lParam==hwndBtn&&wParam==1){return (LRESULT)hBrush;}break;*/case WM_DESTROY:::PostQuitMessage(0);return 0;case WM_PAINT:hdc = ::BeginPaint(hwnd,&ps);for(i=0;i<8;i++)for(j=0;j<7;j++){if(bDraw[i][j])::Draw(hwnd,hwndBtn[i][j],TRUE);else::Draw(hwnd,hwndBtn[i][j],FALSE);}::EndPaint(hwnd,&ps);return 0;}return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}INT_PTR CALLBACK OptionProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam
)
{static HWND hwndAdult,hwndChild;HBRUSH hBrush;HWND hwndParent;RECT rect;switch(uMsg){//原来可以在这里修改大小的case WM_INITDIALOG:hwndParent = ::GetParent(hwndDlg);::GetWindowRect(hwndParent,&rect);::SetWindowPos(hwndDlg,NULL,rect.left,rect.bottom,0,0,SWP_NOSIZE);return 0;case WM_CTLCOLORDLG:hBrush = ::CreateSolidBrush(RGB(0,128,255));return (INT_PTR)hBrush;case WM_COMMAND:if(wParam==1&&lParam==1){::SendMessage(::GetDlgItem(hwndDlg,IDC_ADULT),BM_SETCHECK,0,0);::SendMessage(::GetDlgItem(hwndDlg,IDC_CHILD),BM_SETCHECK,0,0);}switch(LOWORD(wParam)){case IDC_ADULT://这里设置数据return TRUE;case IDC_CHILD://这里设置数据return TRUE;}break;}return FALSE;
}

转载于:https://www.cnblogs.com/daoluanxiaozi/archive/2011/10/15/2212833.html

相关文章:

从理论到实践 全面理解HTTP/2

前言 为了降低加载时间&#xff0c;相信大多数人都做过如下尝试 Keep-alive: TCP持久连接&#xff0c;增加了TCP连接的复用性&#xff0c;但只有当上一个请求/响应完全完成后&#xff0c;client才能发送下一个请求Pipelining: 可同时发送多个请求&#xff0c;但是服务器必须严格…

开机不进去桌面执行gui_电脑系统崩溃进不去,简单几步设置U盘,快速找回桌面重要文件...

hello~我可爱的粉丝们&#xff01;今天粮小白分享一个电脑系统崩溃无法开机&#xff0c;怎么把电脑数据保存备份的小技能&#xff0c;就来就点个关注吧。每天更新生活必备技能哦。电脑系统崩溃进不去&#xff0c;简单几步设置U盘&#xff0c;快速找回桌面重要文件近些年来&…

java遍历给定目录,树形结构输出所有文件,包括子目录中的文件

http://www.cnblogs.com/jenson138/p/4691418.html import java.io.File;public class ReadDirectory {// 文件所在的层数private int fileLevel;/*** 生成输出格式* param name 输出的文件名或目录名* param level 输出的文件名或者目录名所在的层次* return 输出的字符串*/pu…

数据千万条,备份第一条,数据找不回,老板两行泪

2019独角兽企业重金招聘Python工程师标准>>> 开工第一天&#xff0c;请带着你的回忆看下文&#xff0c;想想你这些年删过的库&#xff0c;被删过的库。。。 数据库备份是个老生常谈的话题&#xff0c;看似很简单&#xff0c;但在实际操作过程中&#xff0c;运维人员…

【转】Visual Studio 2010 架构图之用例图(UML Use Case Diagram)

这篇文章是来自园子的&#xff0c;我只是把自己觉得重要的地方&#xff0c;做了更鲜明的标记和解释。 使用Visual Studio 2010可以在项目中添加架构图&#xff0c;项目可以是ASP.NET、Windows Forms、...&#xff0c;也可以创建单独的Modeling Projects。 可以通过下图方式在项…

spi通讯不需要地线吗_抖音真的需要养号吗?不需要!千万别被割了韭菜

“抖音新账号一定要先养号&#xff0c;再发布作品。”这句话&#xff0c;你是不是听很多人跟你讲过&#xff1f;包括我也曾在之前的推文里建议大家先养号&#xff0c;并且说的有理有据。&#xff08;要打脸了&#xff09;但是&#xff0c;这是一句谣传&#xff01;暂且不说谣言…

Linux学习之setjmp和longjmp函数

nsetjmp和longjmp函数实现函数之间的跳转(需包含头文件"setjmp.h")&#xff1a;函数原型&#xff1a;int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); setjmp函数用于设置跳转的目的位置&#xff0c;longjmp函数进行跳转。env&#xff1a;保留了需要返…

Ubuntu 和 Redhat / Fedora 服务管理命令对比表(附Fedora16新的服务管理工具systemctl )...

以 apache/httpd 服务作为例子 任务 Red Hat / Fedora Ubuntu Ubuntu (with sysv-rc-conf or sysvconfig) 立即启动/停止某服务 service httpd start invoke-rc.d apache start service apache start 启动时自动加载 chkconfig httpd on update-rc.d apache defaults…

酷派、华为不能打印log解决办法

我发现我的手机无法再eclipse里面输出自己打的log.i等log&#xff0c;一开始还以为是我手机root或刷过机的问题。 最终非常偶然找到了解决的方法&#xff1a; 酷派大神F1&#xff0c;F2在出厂时将log的级别做了限制。 解除限制的方法是&#xff1a;拨号盘输入*20121220# ->…

80070583类不存在_Java自学-接口与继承 内部类

&#xfeff;Java 内部类内部类分为四种&#xff1a; 非静态内部类 静态内部类 匿名类 本地类步骤 1 : 非静态内部类非静态内部类 BattleScore “战斗成绩” 非静态内部类可以直接在一个类里面定义比如&#xff1a; 战斗成绩只有在一个英雄对象存在的时候才有意义 所以实例化Ba…

java 初识对象和对象引用的关系

在接触java之前就知道了java的对象引用&#xff0c;但概念一直很模糊&#xff0c;看了《Head First in Java》后觉得书中的例子很有趣&#xff0c;便分享给大家。 首先要搞清对象引用是什么&#xff1f; 我们都知道变量可以存放数据&#xff0c;就像杯子一样&#xff0c;不同大…

IOS UI 代码创建UIButton,UITextField,UILabel

//add a Label UILabel *label[[UILabelalloc]initWithFrame:CGRectMake(100,20, 150, 40)]; [label setText:"i am a label "]; label.font[UIFontsystemFontOfSize:20]; label.textAlignmentNSTextAlignmentLeft; //文字内容自适应标签宽度 label.adjustsFontSizeT…

Hash join 和nested loop

Hash join 和nested loop 总所周知&#xff0c;Oracle数据库常用的两种优化器&#xff1a;RBO&#xff08;rule-based-optimizer&#xff09;和CBO(cost-based-optimizer)。目前更多地采用CBO(cost-based-optimizer)基于开销的优化器。在CBO方式下&#xff0c;Oracle会根据表及…

minus oracle 顺序_oracle minus的用法来一波

Oracle Minus关键字SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0c;而不会在最后的结果中出现。如…

我现在的vimrc配置文件

我现在的vimrc配置文件 runtime! debian.vim "设置编码 set encodingutf-8 set fencsutf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set fileencodingsutf-8,ucs-bom,chinese"语言设置 set langmenuzh_CN.UTF-8" command WQ wq command Wq wq command W w…

UVA 10269 Adventure of Super Mario

UVA_10269 由于马里奥的飞行距离有限&#xff0c;因此为了方便处理&#xff0c;我们首先用floyd预处理出马里奥可以飞行的两点间的最短路&#xff0c;然后再将图分成K1层用SPFA求最短路即可。 #include<stdio.h>#include<string.h>#define MAXD 130#define MAXN 20…

“5G杀手级应用”Cloud VR 华为如何打响5G第一枪

雷锋网消息&#xff0c;近日华为在上海召开华为云 5G Cloud VR服务发布会暨5G Cloud VR开发者沙龙&#xff0c;Cloud VR有何潜力成为5G第一批杀手级应用&#xff0c;华为又在其中扮演怎样的角色。Cloud VR和5G更配生产决定消费&#xff0c;消费反作用于生产&#xff0c;对于5G也…

昆仑通态通用版找不到驱动_2021深圳新安西门子伺服驱动电机回收合作共赢

2021深圳新安西门子伺服驱动电机回收合作共赢 一个企业,应尽量做到PLC的机型统主要考虑到以下三方面问题&#xff1a;机型统其模块可互为备用,便于备品备件的采购和管理。机型统其功能和使用方法类似,有利于技术力量的培训和技术水平的提高。机型统其外部设备通用,资源可共享,易…

熟人Dubbo 系列1-Dubbo什么

Dubbo阿里巴巴内部SOA治理方案和服务的核心框架。每天2000 个服务提供3,000,000,000 次訪问量支持&#xff0c;并被广泛应用于阿里巴巴集团的各成员网站。Dubbo自2011年开源后&#xff0c;已被很多非阿里系公司使用。Dubbo[]是一个分布式服务框架&#xff0c;致力于提供高性能和…

CentOS源码安装GitLab汉化版第3版

软件版本&#xff1a; 软件版本CentOS7.5GraphicsMagick1.3.31Git2.21.0Ruby2.5.3Go1.12Node.js10.15.2PostgreSQL11.2Redis5.0.3GitLab11.8.0 汉化版Nginx1.14.21. 安装依赖 yum -y install libicu-devel patch gcc-c readline-devel zlib-devel libffi-devel openssl-devel m…

用JSP+JDBC开发Web程序

以前一直想找个纯粹的JSPJDBC开发Web程序的架构&#xff0c;一直没有找到合适的&#xff0c;后来自己写了一个简单实现&#xff0c;并实施了几个项目。 此开发架构的特点是&#xff1a; 1.架构技术简单&#xff0c;只包含JSP和JDBC&#xff0c;不需要学习即可快速开发Web应用&a…

catia怎么创建约束快捷键_答疑 | CATIA结构树无法显示怎么办?

问题有小伙伴反馈&#xff0c;设计过程中&#xff0c;CATIA的结构树不见了……怎么办&#xff1f;问题听起来很简单&#xff0c;但总能难倒一些新手。原因与解决方案&#xff1a;下面针对产生该问题的不同的原因&#xff0c;提出不同的解决方案。第一种情况原因&#xff1a;结构…

【UVA】11992 - Fast Matrix Operations(段树模板)

主体段树&#xff0c;要注意&#xff0c;因为有set和add操作&#xff0c;当慵懒的标志下推。递归优先set&#xff0c;后复发add&#xff0c;每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了&#xff0c;可笑的是我对着模板找了一个多小时的错。 #include&…

记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案

问题概述使用阿里云rds for MySQL数据库&#xff08;就是MySQL5.6版本&#xff09;&#xff0c;有个用户上网记录表6个月的数据量近2000万&#xff0c;保留最近一年的数据量达到4000万&#xff0c;查询速度极慢&#xff0c;日常卡死。严重影响业务。 问题前提&#xff1a;老系统…

SQL Server 2008 下载地址(微软官方网站)

哪里有sqlserver2008下载&#xff1f;2011-9-24 23:58提问者&#xff1a;ooseestars | 浏览次数&#xff1a;3252次2011-9-26 11:38最佳答案SQL Server 2008 下载地址(微软官方网站) 中文版(3.28GB)&#xff1a;http://sqlserver.dlservice.microsoft.com/dl/download/B/8/0/B8…

java实现最长连续子序列_最长公共子序列 ||

问题&#xff1a;在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来&#xff0c;因为最长公共子序列可能不只一种。难点&#xff1a;输出一个最长公共子序列并不难&#xff0c;难点在于输出所有的最长公共子序列&#xff0c;我们需要在动态规划表上进…

替换元素和非替换元素的学习

替换元素和非替换元素的学习 (元素)[妙瞳] 引言 元素是文档结构的基础&#xff0c;在CSS中&#xff0c;每个元素生成了一个包含了元素内容的框&#xff08;box,也翻译为“盒子”&#xff09;。但是不同的元素显示的方式会有所不同&#xff0c;例如div和span不同&#xff0c;而s…

第十六天-企业应用架构模式-离线并发模式

1.乐观离线锁 &#xff08;Optimistic Offline Lock&#xff09; 运行机制 使用时机 例&#xff1a;领域层与数据层数据映射器 2.悲观离线锁 &#xff08;Pessimistic Offline Lock&#xff09; 运行机制 使用时机 例&#xff1a;简单锁管理对象 3.粗粒度锁 &#xff08;Coarse…

hdu1518 bjfuoj1042 zoj1909 poj2362 经典的搜索加剪枝

bjfuoj的测试数据最水&#xff0c;用很简单的方法一下就过了&#xff0c;又调了好长时间&#xff0c;才过掉其它OJ上的这道题目~ /* * hdu1518/win.cpp * Created on: 2011-11-8 * Author : ben*/#include <cstdio>#include <cstdlib>#include <cstring>#…

投影参数_智能投影仪参数如何去看,其实很简单

我又来给大家安利投影仪了&#xff0c;毕竟用过的都知道有多刺激&#xff0c;但是估计很多人看到参数就头疼了吧&#xff1f;所以话不多说&#xff0c;直接上科普啦流明亮度流明怎么算的&#xff0c;家人们就不用详细了解了&#xff0c;只用记住&#xff0c;流明越高画面就越亮…