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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用linux命令通常做什么,如何知道你在 Linux 里最常使用的几个命令?

不知道大家自接触 Linux 以来&#xff0c;都使用过哪些命令&#xff0c;其中最常用的命令是什么&#xff1f;我最常用的命令之一是 sudo &#xff0c;因为我每天都在使用它在 Linux 上安装、更新、删除软件包以及其它各种需要超级用户权限的操作。那么你知道你自己最经常使用的…

资料分享 | python机器学习教程分享来袭

小天从大学开始&#xff0c;便开启资料收集功能。近几年以AlphaGo为契机&#xff0c;人工智能进入新的发展阶段&#xff0c;再加上日常的深入研究&#xff0c;小天收集整理了丰富的机器学习资料&#xff0c;内容涵盖“机器学习视频”&#xff0c;“机器学习教程”等。截止到今天…

Autofac框架初识与应用

一、前言这上一篇中&#xff0c;主要讲述了什么是IoC容器&#xff0c;以及了解到它是DI构造函注入的框架&#xff0c;它管理着依赖项的生命周期以及映射关系&#xff0c;同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器&#xff0c;以及它的实例注册方式和相应的生命周…

linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)

SUSE Linux 10配置裸设备(raw devices)裸设备&#xff0c;是没有经过格式化的分区或磁盘&#xff0c;也叫裸分区(原始分区)&#xff0c;不被Unix通过文件系统来读取的特殊字符设备。它由应用程序负责对它进行读写操作。不经过文件系统的缓冲&#xff0c;是不被操作系统直接管理…

聊一聊数据导出那些事

前言 数据导出&#xff0c;这可以说是一个随处可见的需求&#xff0c;大部分管理平台&#xff0c;报表系统都会有这个需求。对于这个需求&#xff0c;不少系统会做限制&#xff0c;只能从系统导出几千或几万的数据&#xff0c;再多的话就要提申请&#xff0c;经过层层审批&…

ubuntu11.10 64bits机器安装flash方法

自动查找这个plugin&#xff0c;是找不到的。需要添加app源&#xff0c;再进行安装。步骤如下&#xff1a;添加ppa源在终端里输入sudo add-apt-repository ppa:sevenmachines/flashsudo apt-get updatesudo apt-get install flashplugin-installer 转载于:https://www.cnblogs.…

如何黑掉一台根本不联网的电脑

一直以来&#xff0c;拿到一台电脑上的密钥&#xff0c;方法无非有以下三种&#xff1a;1、直接拿到这台电脑&#xff0c;然后输入木马病毒进行盗取。&#xff08;此种略微LowB的方法风险在于&#xff1a;如果被电脑主人“捉奸在床”&#xff0c;愤而报警&#xff0c;则需要黑客…

linux防火墙停用,关闭LINUX防火墙

2011-11-28 13:03朋友你好&#xff01;我刚开始搞linux&#xff0c;碰到了很多问题&#xff0c;想问你下&#xff0c;希望能帮我解答下。下面是我的一段shell 程序#&#xff01;/bin/shwhile [ 0 ]doread scoreif [ $score -lt 60 ];thenecho " you must work hard!"…

通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

首先感谢张队geffzhang公众号转发了上一篇文章&#xff0c;希望广大.neter多多推广dapr&#xff0c;让云原生更快更好的在.net这片土地上落地生根。 书接上回通过Dapr实现一个简单的基于.net的微服务电商系统&#xff0c;今天来分享一下这套电商demo的通讯部分到底是如何工作的…

windows下整合tomcat和nginx

tomcat自带的apache服务器对于并发请求的处理能力比较差&#xff0c;并且耗费资源很大&#xff0c;而nginx这方便却很强悍&#xff0c;以下是在windows下整合tomcat和nginx的过程。 1.准备工作 下载tomcat&#xff08;http://tomcat.apache.org/download-70.cgi&#xff09;,下…

从飞机上看下雨是这样子,太震撼了!

不同的角度&#xff0c;不一样的世界&#xff01;来源&#xff1a;环球顶尖摄影版权归原作者所有&#xff0c;转载仅供学习使用&#xff0c;不用于任何商业用途&#xff0c;如有侵权请留言联系删除&#xff0c;感谢合作。数据与算法之美用数据解决不可能长按扫码关注

linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)

作业一&#xff1a;1) 新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master”2) 修改natasha用户的家目录为/Natasha3) 查看用户信息配置文件的最后一行4) 为natasha用户设置密码“123”5) 查看用户密码配置文件的最后一行6) 将natasha用…

NET问答: 为什么 null + true = string 呢?

咨询区 Javed Akram&#xff1a;请问 null true 为什么是一个 string 类型的 True&#xff0c;代码如下&#xff1a;static void Main(string[] args){string b null true;Console.WriteLine(b);}谁知道这背后的原理&#xff1f;回答区 JaredPar&#xff1a;这是因为你一旦引…

华为21级程序员月薪曝光:270k封神!众网友直呼长见识……

如果一个人的薪水是每月几万&#xff0c;估计很多人都会认为很高&#xff0c;而能拿到这么高薪水的人一定是一个非常优秀人。最近&#xff0c;一名HR在互联网上发布了一个内容。该公司表示在招聘简历中找到华为高管的简历&#xff0c;简历的级别为21&#xff0c;月薪为27万&…

做移动互联网App,你的测试用例足够吗?

我在面试测试工程师时&#xff0c;经常问到的一个问题是“给出Word另存为这个功能的测试用例”。除开基本的测试用例外&#xff0c;考虑到各种异常情况&#xff0c;例如内存已满、硬盘空间不足是非常重要的。但是针对移动互联网App来说&#xff0c;情况还要复杂的多。一个重要原…

linux 手机 wlan信号桥,手机WLAN信号桥是什么?WLAN信号的作用和使用方法

什么是寒假必备&#xff1f;温暖的被窝和wifi绝对是不能少的。今天就给大家介绍一下和手机WIFI有关的WLAN信号桥的知识&#xff0c;让大家在寒假享受WIFI又多了一种选择。感兴趣的可以一起来看看。一、什么是WLAN信号桥&#xff1f;WLAN信号桥简单的来说就是手机连接一个WiFi后…

.NET 6 HotReload的试用

.net v6.0.0-preview.3的HotReload我是极喜欢的&#xff0c;因为之前有这样的需求——状态不丢&#xff0c;上下文不丢。为了验证&#xff0c;安装完.net 6 preview 3后&#xff0c;新建一个webapi项目&#xff0c;写了如下简单代码&#xff1a;using Microsoft.AspNetCore.Mvc…

如何撬动机器学习的冰山一角?

目前&#xff0c;人工智能的应用日渐广泛。而作为人工智能核心的机器学习&#xff0c;是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

linux 下运行libnids,libnids出错

2017/03/28因为246上一般用的东西都比较多了&#xff0c;就直接使用了这部分。但当初编译的时候也不是我弄得。今天想试一下libnids的编程。编译错误在网上查了下&#xff0c;说是版本不够的原因&#xff0c;那我也不能重新编译了&#xff0c;毕竟还有别人说不定用的好好的。gc…

服务治理治什么,10张图告诉你答案

凌晨四点被公司的监控告警叫醒了&#xff0c;告警的原因是生产环境跑批任务发生故障。即刻起床处理故障&#xff0c;但还是花了不少时间才解决。这次故障是一次数据校验的跑批任务&#xff0c;校验前面跑批任务的数据是否正确。幸运的是&#xff0c;之前的核心任务已经完成&…