to leelee() :这个我知道,但是有些不规则的程序就是没有虚线框! 有些有! (拖动时候显示窗口内容取消)
问题: 是不是要做不规则窗口,都用setwindowrgn这个函数实现的,有其他实现方法吗?
拖动时显示虚线是 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.
to : kingcom(猪眼看人生SP1|不当帮主了) 有使用SetLayeredWindowAttributes的例子代码吗?谢谢!
这个很简单呀...你看一看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;
http://www.vckbase.com/document/viewdoc.asp?id=206
void CFffDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
CDialog::OnMoving(fwSide, pRect);
// TODO: Add your message handler code here
MoveWindow(pRect,true);
}
不过在移动的时候边框上会有一虚线...不知对不规则的窗体会不会这样...
{
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,然后再填充.
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.
在win2000以上可以用SetLayeredWindowAttributes来实现!!!!!!!!!
{
// 使窗体能随鼠标移动
SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0); CDialog::OnLButtonDown(nFlags, point);
}
用这个方法绝对不会有虚线框
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;
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);
} 以上代码系本人转贴他人,特此声明.
可以在鼠标左键按下的时候SetCapture()记下当前鼠标位置
然后WM_MOUSEMOVE消息中鼠标但前位置和原来位置比较移动窗口
左键放开的时候ReleaseCapture()就可以了如果你想要不规则虚线也可以,只不过麻烦一点,在WM_MOUSE中自己画,至于怎么画是有技巧的,因为不再窗口内部,这个我的心得不多,不能给你帮助了.
这个好像没有~