一生一世学坛

 找回密码
 立即注册
搜索
查看: 3285|回复: 0
打印 上一主题 下一主题

自定义一个windows窗口类 new时显示 delete时隐藏

[复制链接]

334

主题

385

帖子

6891

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6891
跳转到指定楼层
楼主
发表于 2019-3-25 12:07:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自定义一个windows窗口类 new时显示 delete时隐藏,可以方便的在自己的项目中使用原创文章拒绝转载
使用方法如下:
  1. #include "SpecialWnd.h"
  2. SpecialWnd * swnd;
  3. void CTestDlg::OnBnClickedButton8()
  4. {
  5.         if (swnd == NULL)
  6.         {
  7.                 swnd = new SpecialWnd(AfxGetApp()->m_hInstance,//模块句柄
  8.                         this->GetSafeHwnd(),//父窗口句柄,可以是其它进程的
  9.                         0, 0, 100, 100);//x,y,width,height
  10.         }
  11. }


  12. void CTestDlg::OnBnClickedButton9()
  13. {
  14.         if (swnd)
  15.         {
  16.                 delete swnd;
  17.                 swnd = NULL;
  18.         }
  19. }
复制代码




头文件如下:
  1. #pragma once
  2. #include <Windows.h>
  3. #include <map>
  4. class SpecialWnd
  5. {
  6. public:
  7.         SpecialWnd(HINSTANCE hInstance, HWND hWndParent,int x,int y,int width, int height);
  8.         ~SpecialWnd();

  9.         static std::map<HWND, SpecialWnd*> windowMap;//句柄和对象的对应关系

  10. private:
  11.         HWND hWnd;
  12.        
  13. };

复制代码
cpp文件如下:
  1. #include "stdafx.h"
  2. #include "SpecialWnd.h"
  3. std::map<HWND, SpecialWnd*> SpecialWnd::windowMap;
  4. LRESULT CALLBACK WndProc(HWND hWnd,
  5.         UINT msg,
  6.         WPARAM wParam,
  7.         LPARAM lParam)
  8. {

  9.         SpecialWnd *pThisWnd = NULL;//用于在对应的对象内处理窗口消息
  10.         if (SpecialWnd::windowMap.find(hWnd) != SpecialWnd::windowMap.end())
  11.         {
  12.                 pThisWnd = SpecialWnd::windowMap[hWnd];
  13.         }
  14.         switch (msg)
  15.         {
  16.         case WM_LBUTTONDOWN:
  17.         {
  18.                 if (pThisWnd != NULL)
  19.                 {

  20.                 }
  21.         }
  22.         break;
  23.         case WM_RBUTTONDOWN:
  24.         {
  25.                 if (pThisWnd != NULL)
  26.                 {

  27.                 }
  28.         }
  29.         break;
  30.         case WM_DESTROY:               
  31.                 break;
  32.         default:
  33.                 return ::DefWindowProc(hWnd, msg, wParam, lParam);
  34.         }
  35.         return 0;
  36. }

  37. SpecialWnd::SpecialWnd(HINSTANCE hInstance, HWND hWndParent, int x, int y, int width, int height)
  38. {
  39.         TCHAR lpszClassName[] = TEXT("SpecialWnd");
  40.         WNDCLASS wc;
  41.         wc.style = CS_HREDRAW | CS_VREDRAW;
  42.         wc.lpfnWndProc = WndProc;
  43.         wc.cbClsExtra = 0;
  44.         wc.cbWndExtra = 0;
  45.         wc.hInstance = hInstance;
  46.         wc.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
  47.         wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
  48.         wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
  49.         wc.lpszMenuName = NULL;
  50.         wc.lpszClassName = lpszClassName;

  51.         RegisterClass(&wc);

  52.         hWnd = CreateWindow(lpszClassName,
  53.                 TEXT("Windows"),
  54.                 WS_POPUP | WS_DLGFRAME | WS_VISIBLE,//不带标题栏
  55.                 x, y, width, height,
  56.                 hWndParent,
  57.                 NULL,
  58.                 hInstance,
  59.                 NULL);

  60.         ::ShowWindow(hWnd, SW_SHOWNORMAL);
  61.         ::UpdateWindow(hWnd);

  62.         // 实现透明必须设置WS_EX_LAYERED标志
  63.         LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE);
  64.         nRet = nRet | WS_EX_LAYERED;
  65.         ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet);

  66.         ::SetLayeredWindowAttributes(hWnd, 0, 123, LWA_ALPHA);    // 设置半透明

  67.         RECT rctA;
  68.         ::GetWindowRect((HWND)(hWndParent), &rctA);
  69.         ::MoveWindow(hWnd, rctA.left, rctA.top,
  70.                 (rctA.right - rctA.left)/2, (rctA.bottom - rctA.top)/2, TRUE);//覆盖父窗口的一半

  71.         SpecialWnd::windowMap[hWnd] = this;
  72. }


  73. SpecialWnd::~SpecialWnd()
  74. {
  75.        
  76.         if (::IsWindow(hWnd))
  77.         {
  78.                 if (SpecialWnd::windowMap.find(hWnd) != SpecialWnd::windowMap.end())
  79.                 {
  80.                         SpecialWnd::windowMap.erase(hWnd);
  81.                 }
  82.                 ::ShowWindow(hWnd, SW_HIDE);
  83.                 ::DestroyWindow(hWnd);       
  84.                 hWnd = NULL;
  85.         }

  86.         //::CloseHandle(hWnd);
  87. }
复制代码
优点就是控制简单,new显示,delete隐藏。创建参数少。内部的样式可以自己调整。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|分享学习  

GMT+8, 2024-6-14 07:08 , Processed in 0.048492 second(s), 8 queries , File On.

声明:本站严禁任何人以任何形式发表违法言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© 2017 zamxqun@163.com

皖公网安备 34010402700634号

皖ICP备17017002号-1

快速回复 返回顶部 返回列表