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

拖动鼠标改变窗体大小的C++代码

   在C++Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,不能改变窗体大小,也不能拖动窗体。那么如何拖动及用鼠标改变无边框窗体大小呢?拖动无边框窗体的解决方法很多,例如:
1. 向窗体发送WM_NCLBUTTONDOWN消息,LParam = HTCAPTION
2. 向窗体发送WM_SYSCOMMAND消息,LParam = SC_MOVE | HTCAPTION;
3. 截获WM_NCHITTEST消息,返回HTCAPTION让系统认为鼠标正在标题栏上
等等。更改窗体大小可以用API:SetWindowPos,那么用拖动鼠标来改变无边框窗体大小呢?答案还是WM_NCHITTEST。

    在Windows系统中所有鼠标消息都要靠WM_NCHITTEST来建立,任何鼠标动作都会触发WM_NCHITTEST,触发次数和鼠标驱动程序每秒钟派发多少消息有关。以下代码是在程序中截获WM_NCHITTEST,ccrun(老妖)用C++Builder的方法实现的,通过重载WndProc来截获窗体消息,当然,还可以通过消息映射或接管WindowProc等来实现。
在单元文件的.h文件中加入:

private:    // User declarations
    void __fastcall WndProc(TMessage &Msg);

在单元文件的.cpp文件中加入:
// 重载窗体的WndProc实现截获窗体消息
void __fastcall TForm1::WndProc(TMessage &Msg)
{
    switch(Msg.Msg)
    {
    case WM_NCHITTEST: //
    {
        // 分解当前鼠标的坐标
        int nPosX = LOWORD(Msg.LParam); 
        int nPosY = HIWORD(Msg.LParam);
        if(nPosX >= Left + Width - 2 && nPosY >= Top + Height - 2)


    如果程序中有多个窗体都是无边框风格,但都想用鼠标拖动来改变窗体大小的话,建议new一个窗体,设成无边框,截获WM_NCHITTEST消息实现可鼠标拖动大小,然后其他的窗体统一从这个窗体继承就可以了。不必在每个窗体中都重载WndProc,那样效率太低了。这样的设计方法可以延伸到其他方面,比如窗体控件的自绘,在父窗体中将代码写好,然后继承就是了。

附录:
/*
 * WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
 */
#define HTERROR             (-2)
#define HTTRANSPARENT       (-1)
#define HTNOWHERE           0
#define HTCLIENT            1
#define HTCAPTION           2
#define HTSYSMENU           3

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接