炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9105|回复: 7

【分享】自绘标题栏(隐藏系统标题栏)

[复制链接]

该用户从未签到

发表于 2012-10-10 23:26:34 | 显示全部楼层 |阅读模式
自绘标题栏主要是想更全面的DIY自己的窗口,隐藏系统自带标题栏后,需要自己绘制标题栏,然后在上面做消息相应,还要做最大化 最小化 关闭的处理,听起来很麻烦,其实代码量很少,这样一来软件界面的设置完全自定义了。具体原理不多说,代码如下:
  1. // test.cpp : Defines the entry point for the application.
  2. //

  3. #include "stdafx.h"
  4. #include "test.h"

  5. #pragma comment(lib, "XCGUId.lib")
  6. #include "xcgui.h"

  7. //设置标题栏高度
  8. #define TITLE_HEIGHT        30

  9. //窗口句柄
  10. HWINDOW hWin=NULL;
  11. //标题栏变量
  12. HELE titlePic=NULL;

  13. //处理鼠标按下消息 用于移动自绘标题栏
  14. BOOL CALLBACK WinMouseLeftDown(HWINDOW hWindow,UINT flags,POINT *pPt)
  15. {
  16.         //如果不是子元素 且在标题栏高度内
  17.         if(!XEle_IsHitChildEle(titlePic, pPt) && pPt->y<=TITLE_HEIGHT)
  18.         {
  19.                 ::PostMessage(XWnd_GetHWnd(hWindow), WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(pPt->x,pPt->y));
  20.         }

  21.         return FALSE;
  22. }

  23. //关闭按钮功能
  24. BOOL CALLBACK CloseOnClick(HELE hEle,HELE hEventEle)
  25. {
  26.         if (hEventEle==hEle)
  27.         {
  28.                 XWnd_CloseWindow(XEle_GetHWindow(hEle));
  29.         }

  30.         return FALSE;
  31. }

  32. int APIENTRY _tWinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
  33. {
  34.         XInitXCGUI();
  35.         //创建无标题栏窗口
  36.         hWin=XWnd_CreateWindow(0, 0, 200, 100, NULL, NULL, XC_SY_CENTER | XC_SY_BORDER );

  37.         XWnd_ShowWindow(hWin,SW_SHOW);
  38.         //设置边框大小
  39.         XWnd_SetBorderSize(hWin, 2, 2, 2, 2);
  40.         //绘制假标题栏
  41.         RECT p;
  42.         GetWindowRect(XWnd_GetHWnd(hWin), &p);
  43.         int width=p.right-p.left, height=p.bottom-p.top;
  44.         titlePic=XPic_Create(0, 0, width, TITLE_HEIGHT, hWin);
  45.         //加载图片 拉伸显示
  46.         XPic_SetImage(titlePic, XImage_LoadRes (IDB_TITLE_BJ, L"PNG", TRUE));
  47.         //设置鼠标左键消息 用于拖动标题栏
  48.         XWnd_RegisterMessage(hWin, WM_LBUTTONDOWN, WinMouseLeftDown);
  49.         //设置标题
  50.         HELE titleStatic=XStatic_Create(10, 5, 100, 30, L"自绘标题栏", hWin);
  51.         //设置透明
  52.         XEle_SetBkTransparent(titleStatic, TRUE);
  53.         XEle_SetTextColor(titleStatic, RGB(255, 255, 255));
  54.         //设置关闭按钮
  55.         HELE sysCloseBtn=XBtn_Create(170, 3, 20, 20, NULL, titlePic);
  56.         XEle_RegisterEvent(sysCloseBtn, XE_BNCLICK, CloseOnClick);

  57.         XRunXCGUI();

  58.         return 0;
  59. }

复制代码




  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2012-10-10 23:30:46 | 显示全部楼层

    该用户从未签到

    发表于 2013-1-25 10:41:00 | 显示全部楼层
    mark一下,感谢分享!

    该用户从未签到

    发表于 2013-1-26 13:23:30 | 显示全部楼层
    本帖最后由 卖萌de猫 于 2013-1-26 13:54 编辑

    很好很强大。原理很简单:通过设置CreateWIndow的标记去掉标题栏(不要用默认的)。然后用一个图片作为自己的标题栏(其实用Ele神马的也行),模拟鼠标点击的行为。
    因为我们平时通过点击标题栏移动窗口是发送了WM_NCLBUTTONDOWN,Windows的默认消息处理会帮助我们移动窗口,所以LZ就在鼠标点击标题栏的时候PostMessage(XWnd_GetHWnd(hWindow), WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(pPt->x,pPt->y)); 发送了一个这样的消息,具体含义我在MSDN查到的(长见识了,以前不懂)。关闭按钮那个也一样,当鼠标点击关闭的时候就模拟关闭。

    该用户从未签到

    发表于 2013-7-18 23:09:08 | 显示全部楼层
    本帖最后由 风无影 于 2013-7-18 23:09 编辑

    这里新手同志需要注意一点
    //创建关闭按钮
    HELE sysCloseBtn=XBtn_Create(170, 3, 20, 20, NULL, titlePic);  //这里是 titlePic 而不是hWin
    XEle_RegisterEvent(sysCloseBtn, XE_BNCLICK, CloseOnClick);

    该用户从未签到

    发表于 2014-8-31 12:05:02 | 显示全部楼层
    ,正是我需要的。

    该用户从未签到

     楼主| 发表于 2014-9-3 20:30:14 | 显示全部楼层
    我也正需要 哎 真想不到又需要了

    该用户从未签到

    发表于 2014-10-24 22:24:50 | 显示全部楼层
    正需要 不错
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-9-20 00:58 , Processed in 0.074489 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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