先秀一下我的收获吧!

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

win32的一个售票程序,收获有非常的多相关推荐

  1. 一个高级程序员的建议

    一位高级程序员给学弟学妹的建议(转载) 我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力 去追赶.我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.N ...

  2. 程序员之路——一个老程序员对刚上大学的学弟学妹的忠告

    原始链接已不可考,原文略有改动. 始终认为,对一个初学者来说,IT界的技术风潮是不可追赶. 我时常看见自己的DDMM们把课本扔了,去买些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常 ...

  3. wxWidgets:编写一个应用程序

    wxWidgets:编写一个应用程序 wxWidgets:编写一个应用程序 这段代码有什么作用? wxWidgets:编写一个应用程序 您好,欢迎来到本教程.像我一样,您可能尝试过使用 Win32 库 ...

  4. c语言第一个mfc程序,c语言之MFC的进程和线程

    MFC的进程和线程 1.Win32的进程和线程概念 进程是:一个可执行的程序,由私有虚拟地址空间.代码.数据和其他操作系统资源(如进程创建的文件.管道.同步对象等)组成.一个应用程序可以有一个或多个进 ...

  5. 一个托盘程序演示 -闹钟 Alert

    From: http://www.vckbase.com/document/viewdoc/?id=996 下载源代码 关键字:托盘 Tray 想必大家都看见过那些在系统托盘(Tray)中的程序吧,本 ...

  6. 如何“干净地”终止 Win32 中的应用程序

    如何"干净地"终止 Win32 中的应用程序 察看这篇文章对应的产品 文章 ID : 178893 最后更新日期 : 2004年11月25日 版本 : 2.2 本页内容 概要 更多 ...

  7. 是非人生 — 一个菜鸟程序员的5年职场路 第7节

    是非人生 - 一个菜鸟程序员的5年职场路第7节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...

  8. 是非人生——一个菜鸟程序员的5年人生路

    注意:!!!!!!!!!!!! 文章可能还在连载.请关注: http://topic.csdn.net/u/20080318/10/e4543fc2-d726-465c-bc95-fea14b92db ...

  9. (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

最新文章

  1. ASP.NET AJAX 1.0 发布
  2. 0x0000050蓝屏srvsys_win7电脑出现蓝屏0x00000050提示srv.sys如何解决[多图]
  3. 前端数据可视化可绘制地图等插件:Highcharts、Echarts和D3
  4. 关于android 图像格式问题
  5. 用赫夫曼树进行文件的压缩
  6. android开发相关资料整理【2011-10-04】
  7. error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead.
  8. https 非对称加密
  9. 04_数字的处理方法(保留小数点两位、将数字转化为千分位格式)
  10. 线性表的基本操作Basic operation of SequenceList
  11. 建立矩阵 reshape函数,pascal函数,magic函数,diag函数【Matlab】
  12. RPGMakerMV的插件学习
  13. python如何防止代码查重_怎样避免论文代码查重
  14. android fps测试 apk,性能测试 查看Android APP 帧数FPS的方法
  15. 如何启动单线程实现多线程效果及保证安全?
  16. N-vop、S-vop、Packed Bistream
  17. android 主流框架与技术
  18. 编写Java程序时的一些经验总结
  19. 双击vivado 显示你要以何方式打开.xpr文件或者Vivado无法双击打开xpr工程
  20. 这笔投资你算过吗?―写给二本院校的苦逼青年

热门文章

  1. 计算机网络中的协议数据单元的控制信息主要包括哪些内容
  2. 什么BRIEF算法?BRIEF算法详解
  3. git rebase 和 git merger
  4. Vue的模板语法学习
  5. 2017-2-23 C#基础 中间变量
  6. windows 2012 nps配置
  7. 将表里的数据批量生成INSERT语句的存储过程 增强版
  8. 解决getOutputStream() has already been called for this response[java io流]
  9. Oracle Hints具体解释
  10. ASP.NET技巧:两个截取字符串的实用方法