WEB开发网
开发学院软件开发C++ 如何自定义提示窗口(Hint Window) 阅读

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

 2008-03-08 12:47:17 来源:WEB开发网   
核心提示:// 自定义 THintWindow 类class TCcrunHintWindow : public THintWindow{ bool FActivating; __fastcall TCcrunHintWindow(TComponent* Owner) : THintWindow

  // 自定义 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 = "这是一个文本框";
}

Tags:如何 定义 提示

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接