我想用sdk编写一个不规则窗口程序但是发现很多的例子拖动时都还有那个矩形的虚框,怎么才可以做那种真正的不规则窗口子窗口也可以做成这样的吗??
谢谢!

解决方案 »

  1.   

    看看这个文章吧。
    http://www.vckbase.com/document/viewdoc.asp?id=206
      

  2.   

    to wuxuan:你给的例子我知道,但是有虚线框阿
      

  3.   

    to kingcom: 能详细说说吗??或者代码??谢谢!
      

  4.   

    我用MFC试了一下...直接在WM_MOVING事件中
    void CFffDlg::OnMoving(UINT fwSide, LPRECT pRect) 
    {
    CDialog::OnMoving(fwSide, pRect);

    // TODO: Add your message handler code here
    MoveWindow(pRect,true);
    }
    不过在移动的时候边框上会有一虚线...不知对不规则的窗体会不会这样...
      

  5.   

    void CBoxDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    CDialog::OnMouseMove(nFlags, point);
    if(nFlags == MK_LBUTTON) 
    {
    CRect rect;
    GetWindowRect(&rect);
    point = point - m_point;
    rect.left += point.x;
    rect.top += point.y;
    SetWindowPos(NULL,rect.left,rect.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
    }
    }
    这样的话就没有框了.我有个自己写的很完整的例子,要的话找我.
    先生成不规则的窗口,用CDC::BegingPath()和CDC::EndPath()记录下Rgn,然后再填充.
      

  6.   

    设置windows属性,拖动窗口时显示内容,否则肯定有虚线框,微软的都有
      

  7.   

    这个虚框是Windows用DrawFocusRect画的,要改掉它请在桌面按“右键”->“属性”->在“效果”页面上的“拖动时显示窗口内容(W)”前面打勾,这样拖动你的不规则窗口不会再出现虚框。乃windows风格问题,非程序问题。你如果想拖动时显示不规则虚框,只有自己处理拖动消息SetPixel了。
      

  8.   

    to  shesh(无所谓)能否给完整例子代码?? 谢谢[email protected]
      

  9.   

    to leelee() :这个我知道,但是有些不规则的程序就是没有虚线框! 有些有! (拖动时候显示窗口内容取消)
      

  10.   

    问题: 是不是要做不规则窗口,都用setwindowrgn这个函数实现的,有其他实现方法吗?
      

  11.   

    拖动时显示虚线是 WINDOWS 的设置。如果要改, 用这个函数 :
    BOOL SystemParametersInfo(
      UINT uiAction,  // system parameter to retrieve or set
      UINT uiParam,   // depends on action to be taken
      PVOID pvParam,  // depends on action to be taken
      UINT fWinIni    // user profile update option
    );
    使用 SPI_SETDRAGFULLWINDOWS 这个UIACTION, 见MSDN.
      

  12.   

    >>是不是要做不规则窗口,都用setwindowrgn这个函数实现的,有其他实现方法吗?
    在win2000以上可以用SetLayeredWindowAttributes来实现!!!!!!!!!
      

  13.   

    void CPYDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {

    // 使窗体能随鼠标移动
    SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0); CDialog::OnLButtonDown(nFlags, point);
    }
      

  14.   

    SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
    用这个方法绝对不会有虚线框
      

  15.   

    to  ColderRain:能给一个完整的代码例子??谢谢!![email protected]
      

  16.   

    to : kingcom(猪眼看人生SP1|不当帮主了) 有使用SetLayeredWindowAttributes的例子代码吗?谢谢!
      

  17.   

    这个很简单呀...你看一看MSDN里SetLayeredWindowAttributes的说明...BOOL SetLayeredWindowAttributes(
      HWND hwnd,           // handle to the layered window
      COLORREF crKey,      // specifies the color key
      BYTE bAlpha,         // value for the blend function
      DWORD dwFlags        // action
    );
    crKey中指定想要透明的颜色,在dwFlags中指定LWA_COLORKEY标志...
    具体如何我也忘了...
    你自己试一下...
    如果想又半透明又要不规则的话dwFlags中可为LWA_COLORKEY|LWA_ALPHA;
      

  18.   

    代码如下:
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 
    {            
    typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);          
    MYFUNC fun = NULL;
    //取得SetLayeredWindowAttributes函数指针     
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
    if(fun)fun(this->GetSafeHwnd(),0,128,2);     
    FreeLibrary(hInst); 
    }        以上代码系本人转贴他人,特此声明.
      

  19.   

    to  ColderRain(南海飞羽能否给个完整的例子??[email protected]
      

  20.   

    不要例子啦,不要虚线只能不用WINDOWS的移动,自己移,
    可以在鼠标左键按下的时候SetCapture()记下当前鼠标位置
    然后WM_MOUSEMOVE消息中鼠标但前位置和原来位置比较移动窗口
    左键放开的时候ReleaseCapture()就可以了如果你想要不规则虚线也可以,只不过麻烦一点,在WM_MOUSE中自己画,至于怎么画是有技巧的,因为不再窗口内部,这个我的心得不多,不能给你帮助了.
      

  21.   

    有没有用SDK编写的这方面的例子,有的话也给我发一个,我碰到这个问题已经很久了,自己一直没有解决,先谢谢哪位好心的朋友![email protected]
      

  22.   

    http://win32home.24cc.com/ 有,不过虚线也没有去掉
      

  23.   

    http://www.vckbase.com/document/viewdoc.asp?id=345
    这个好像没有~