本文主要是在一个主窗口下创建一个子窗口。主窗口有一个菜单,菜单下只有设置一个选项,点击设置选项,弹出设置界面,点击设置界面关闭则关闭。我在开发的时候遇到两个问题,第一就是一点设置关闭就整个应用都关了,原来是destroy消息共用了。然后第二个是点击关闭后,设置界面再也显示不出来了,原来是close消息也要分拣。

菜单志愿为IDR_MENU,设置ID选项为ID_SETTING。

文件如下:

Main.cpp

  1. #include "resource.h"
  2. #include<tchar.h>
  3. #include<stdio.h>
  4. #include<windows.h>
  5. #include "SettingMgr.h"
  6. #define ClassName _T("sunxin2006")
  7. HINSTANCE g_hInstance = ;
  8. LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  9. int WINAPI WinMain(HINSTANCE hInstance,
  10. HINSTANCE hPrevInstance,
  11. LPSTR lpCmdLine,
  12. int nCmdShow)
  13. {
  14. WNDCLASS wndcls;
  15. wndcls.cbClsExtra = ;
  16. wndcls.cbWndExtra = ;
  17. wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  18. wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
  19. wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  20. wndcls.hInstance = hInstance;
  21. wndcls.lpfnWndProc = WinSunProc;
  22. wndcls.lpszClassName = _T("sunxin2006");
  23. wndcls.lpszMenuName = NULL;
  24. wndcls.style = CS_HREDRAW | CS_VREDRAW;
  25. RegisterClass(&wndcls);
  26. g_hInstance = hInstance;
  27. HWND hwnd = CreateWindow(ClassName,_T("helloworld"),WS_OVERLAPPEDWINDOW,
  28. ,,,,NULL,LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU)),hInstance,NULL);
  29. ShowWindow(hwnd,SW_SHOW);
  30. UpdateWindow(hwnd);
  31.  
  32. MSG msg;
  33. while(GetMessage(&msg,NULL,,)>)
  34. {
  35. TranslateMessage(&msg);
  36. DispatchMessage(&msg);
  37. }
  38. return msg.wParam;
  39. }
  40. void OnCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
  41. {
  42. int scrWidth,scrHeight;
  43. RECT rect;
  44. //获得屏幕尺寸
  45. scrWidth = GetSystemMetrics(SM_CXSCREEN);
  46. scrHeight = GetSystemMetrics(SM_CYSCREEN);
  47. //取得窗口尺寸
  48. GetWindowRect(hwnd,&rect);
  49. //重新设置rect里的值
  50. rect.left = (scrWidth-rect.right)/;
  51. rect.top = (scrHeight-rect.bottom)/;
  52. //移动窗口到指定的位置
  53. SetWindowPos(hwnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);
  54. }
  55.  
  56. void OnComand(HWND hwnd,WPARAM wParam,LPARAM lParam)
  57. {
  58. WORD uID = LOWORD(wParam);
  59. switch(uID)
  60. {
  61. case ID_SETTING:
  62. {
  63. if(SettingMgr::GetIntance()->m_SettingWnd)
  64. {
  65. ShowWindow(SettingMgr::GetIntance()->m_SettingWnd,SW_SHOW);
  66. }
  67. else
  68. {
  69. SettingMgr::GetIntance()->m_SettingWnd =
  70. CreateWindow(ClassName, "子窗口",
  71. WS_OVERLAPPEDWINDOW|WS_CHILD|WS_VISIBLE|WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, , ,
  72. hwnd, NULL, g_hInstance, NULL);
  73. ShowWindow(SettingMgr::GetIntance()->m_SettingWnd,SW_SHOW);
  74. }
  75. }
  76. break;
  77. }
  78. }
  79.  
  80. VOID OnPaint(HWND hwnd,WPARAM wParam,LPARAM lParam)
  81. {
  82. PAINTSTRUCT ps;
  83. RECT rtClient;
  84. GetClientRect(hwnd,&rtClient);
  85. HDC hdc = BeginPaint(hwnd, &ps);
  86. HDC hMemDC = CreateCompatibleDC(hdc);
  87. HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rtClient.right - rtClient.left, rtClient.bottom - rtClient.top);//rt为RECT变量;
  88. SelectObject(hMemDC, hBitmap);
  89. FillRect(hMemDC, &rtClient,WHITE_BRUSH);
  90. char strText[];
  91. if(hwnd == SettingMgr::GetIntance()->m_SettingWnd)
  92. {
  93. strcpy(strText,_T("我是子窗口!!!"));
  94. }
  95. else
  96. {
  97. strcpy(strText,_T("我是父窗口!!!"));
  98. }
  99. RECT rt={,,,};
  100. DrawText(hMemDC,strText,strlen(strText),&rt,DT_LEFT|DT_TOP);
  101. BitBlt(hdc, , ,rtClient.right - rtClient.left, rtClient.bottom - rtClient.top,
  102. hMemDC, , , SRCCOPY);
  103. DeleteDC(hMemDC);
  104. DeleteObject(hBitmap);
  105. ReleaseDC(hwnd,hdc);
  106. }
  107. LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  108. {
  109. switch(uMsg)
  110. {
  111. case WM_CREATE:
  112. OnCreate(hwnd,wParam,lParam);
  113. break;
  114. case WM_COMMAND:
  115. OnComand(hwnd,wParam,lParam);
  116. break;
  117. case WM_PAINT:
  118. OnPaint(hwnd,wParam,lParam);
  119. break;
  120. case WM_CLOSE:
  121. if(hwnd == SettingMgr::GetIntance()->m_SettingWnd)
  122. {
  123. ShowWindow(SettingMgr::GetIntance()->m_SettingWnd,SW_HIDE);
  124. }
  125. else
  126. {
  127. DefWindowProc(hwnd,uMsg,wParam,lParam);
  128. }
  129. break;
  130. case WM_DESTROY:
  131. if(hwnd == SettingMgr::GetIntance()->m_SettingWnd)
  132. {
  133.  
  134. }
  135. else
  136. {
  137. PostQuitMessage();
  138. }
  139.  
  140. break;
  141. default:
  142. return DefWindowProc(hwnd,uMsg,wParam,lParam);
  143. }
  144. return ;
  145. }

SettingMgr.h

  1. #pragma once
  2. #include<Windows.h>
  3. class SettingMgr
  4. {
  5. protected:
  6. static SettingMgr* _Intance;
  7. public:
  8. HWND m_SettingWnd;
  9. public:
  10. SettingMgr(void);
  11. ~SettingMgr(void);
  12. static SettingMgr* GetIntance();
  13. };

SettingMgr.cpp

  1. #include "SettingMgr.h"
  2. SettingMgr* SettingMgr::_Intance = new SettingMgr();
  3. SettingMgr::SettingMgr(void):m_SettingWnd(NULL)
  4. {
  5. }
  6.  
  7. SettingMgr::~SettingMgr(void)
  8. {
  9.  
  10. }
  11.  
  12. SettingMgr* SettingMgr::GetIntance()
  13. {
  14. return _Intance;
  15. }

由于例子很简单,所以用没用SettingMgr类效果不明显,如果结果比较麻烦,最好使用管理类。

注:修正一下错误,释放BeginPaint,需要调用EndPaint(hwnd,&ps),而不是ReleaseDC,失误了。。。抱歉。。。。

2、第二种方法,比较简单。创建时可以用不同的窗口类,注册时写一个另外的窗口函数。

Win32子窗口的创建的更多相关文章

  1. WIN32进阶必备:跟随鼠标移动的子窗口

    上两张Demo的图,方便朋友们选择是否继续看文章. 在子窗口的白色区域按下鼠标左键不放并移动鼠标可以拖拽子窗口跟随鼠标移动. 选择继续看下去的朋友不要担心,接下来就是正文了. PART 1:Demo功 ...

  2. win32程序之子窗口编程

    win32程序之子窗口编程 一丶简介.什么是子窗口 在前边我们已经讲解了窗口的本质.以及如何注册窗口类跟创建窗口. 还讲了消息循环. 那么有很多窗口其实Windows已经帮我们创建出来了.我们直接使用 ...

  3. System.InvalidOperationException:“寄宿 HWND 必须是子窗口。”

    原文:System.InvalidOperationException:"寄宿 HWND 必须是子窗口." 当试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现 ...

  4. 12 Windows编程——子窗口和系统内置窗口类“BUTTON”

    创建子窗口类,使得子窗口有自己的处理过程. 子窗口类型WS_CHILD不能和WS_POPUP一起使用!为什么子窗口要有自己的处理过程?如果使用主窗口类来创建子窗口,那么子窗口和主窗口将公用窗口处理过程 ...

  5. 转-JS子窗口创建父窗口操作父窗口

    Javascript弹出子窗口  可以通过多种方式实现,下面介绍几种方法 (1) 通过window对象的open()方法,open()方法将会产生一个新的window窗口对象 其用法为: window ...

  6. IE 中创建 子窗口 传值 与接收值 【window.showModalDialog】

    父窗口 创建一个窗口 var backinfo = window.showModalDialog('UserSelect.aspx', '', 'dialogHeight=600px; dialogW ...

  7. Win32 程序开发:创建一个应用程序窗口

    一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSN ...

  8. 使用CreateWindowEx创建子窗口的注意事项

    比如: 使用 HWND child = CreateWindowEx(0,L"childclass",NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIB ...

  9. MFC在子线程中创建窗口(PostMessage方法)

    1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...

随机推荐

  1. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...

  2. jsp之${CTX}理解

    jsp之${CTX} 根据自己的需要选择以下标签. <%@ taglib uri="/struts-tags" prefix="s"%> <% ...

  3. Ubuntu中LightDM是什么(转)

    LightDM(Light Display Manager)是一个全新的轻量级Linux桌面显示管理器,而传统的Ubuntu是使用GNOME桌面标准的GDM. LightDM是一个跨桌面显示管理器,其 ...

  4. OpenFlashChart的图片导出

    http://www.cnblogs.com/mcmurphy/archive/2012/10/15/2724894.html http://teethgrinder.co.uk/open-flash ...

  5. MVC中动作方法三个特性以及解决同名方法冲突

    一.Http请求谓词特性(解决方法同名冲突问题的一个方案) 关于Http谓词特点:经常使用,如果不加上该特性,默认动作方法接收所有谓词的请求一般开发中都会加上谓词,限定请求谓词类型 二.NonActi ...

  6. MVC中路由的一些内容详解

    使用路由的好处:1.能够根据系统需求,灵活的划分请求规则(不同模块请求的URL是不一样的)2.屏蔽物理路径,提高系统的安全性,以上情况是无法根据URL分析视图文件在站点目录中的位置3.有利于搜索引擎优 ...

  7. linux下uart应用编程

    目的:在用户空间通过读写uart设备文件,控制uart串口发送和接收数据. 在用户空间设置uart波特率.奇偶校验使能等操作是通过termios结构体和termios库函数完毕.须要在应用程序中包括t ...

  8. Python3基础(一) Hello World

    对于新手一般会遇到一个问题:学习Python 2还是Python 3呢? 对于我个人而言,我是个完全的新手,没有历史包袱,所以我直接学习Python 3.我相信在未来几年,Python 3会逐步取代P ...

  9. UVA 11423 - Cache Simulator (树状数组)

    UVA 11423 - Cache Simulator (树状数组) option=com_onlinejudge&Itemid=8&category=523&page=sho ...

  10. ChromeDriver only supports characters in the BMP

    ChromeDriver only supports characters in the BMP