当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

如何自定义提示窗口(Hint Window)

     // 自定义 THintWindow 类
    class TCcrunHintWindow : public THintWindow
    {
        bool FActivating;
        __fastcall TCcrunHintWindow(TComponent* Owner)
                : THintWindow(Owner)
        {
            Canvas->Font->Name = "宋体";
            Canvas->Font->Color = clBlack;
            Canvas->Font->Size = 9;
        }
        void __fastcall Paint(void)
        {
            TRect rect = ClientRect;
            // Hint边框颜色
            Canvas->Brush->Color = TColor(0xDBB8BA);
            Canvas->FillRect(rect);
            // 绘制整个Hint的边框
            Canvas->Pen->Color = TColor(0x69230E);
            Canvas->Rectangle(rect);
            // Hint背景的颜色
            Color = clWhite;
            // Hint文字透明
            Canvas->Brush->Style = bsClear;
            // 绘出Hint文字
            Canvas->Font->Color = clBlack;
            Canvas->TextOut(4, int(rect.Bottom / 2)
                    - int(Canvas->TextHeight(Caption) / 2), Caption);
        }
        virtual void __fastcall NCPaint(HDC hdc)
        {
            // 63 63 72 75 6E 2E 63 6F 6D
            Invalidate();
        }
        virtual void __fastcall CreateParams(TCreateParams &Params)
        {
            // 去掉Hint窗口的边框
            Params.Style = Params.Style & ~WS_BORDER;
            THintWindow::CreateParams(Params);
        }
        // Code by ccrun(老妖),做人要厚道,转载请留名
        virtual void __fastcall ActivateHint(const TRect &Rect, const String AHint)
        {
            FActivating = true;
            try
            {
                Caption = AHint;
                TRect r = Rect;
                r.Left -= 10;
                r.Right += 10;
                r.Top -= 5;
                r.Bottom += 5;

                // 更新区域
                UpdateBoundsRect(r);
                // Hint窗口处于屏幕边缘时的调整
                if(r.Top + Height > Screen->DesktopHeight)
                    r.Top = Screen->DesktopHeight - Height;
                if(r.Left + Width > Screen->DesktopWidth)
                    r.Left = Screen->DesktopWidth - Width;
                if(r.Left < Screen->DesktopLeft)
                    r.Left = Screen->DesktopLeft;
                if(r.Bottom < Screen->DesktopTop)
                    r.Bottom = Screen->DesktopTop;
                // 创建一个矩形
                // 63 63 72 75 6E 2E 63 6F 6D
                HRGN hrgn = CreateRectRgn(0, 0, r.Width(), r.Height());
                // HRGN hrgn = CreateRoundRectRgn(0, 0, r.Width(), r.Height(), 4, 4);
                // 设置指定句柄的窗口形状
                SetWindowRgn(Handle, hrgn, true);
                // 改变窗口的位置,Z Order,及其他一些属性
                SetWindowPos(Handle, HWND_TOPMOST, r.Left, r.Top, r.Width(),
                        r.Height(), SWP_SHOWWINDOW  SWP_NOACTIVATE);
                // 重画窗口
                Invalidate();
            }
            __finally
            {
                FActivating = false;
            }
        }
    };
    //---------------------------------------------------------------------------
    // 实现代码
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
        HintWindowClass = __classid(TCcrunHintWindow);
        //
        ShowHint = true;
        Button1->Hint = "这是一个按钮";
        Edit1->Hint = "这是一个文本框";
    }

 

相关内容
赞助商链接