C++从对话框圆角
问题描述:
我想删除一些像素是在具有圆角和我找不到在C++C++从对话框圆角
这里的任何解决方案的对话窗口可见去除像素,是我使用的代码,至于我搜索我想我需要在WS_EX_LAYERED窗口中使用UpdateLayeredWindow函数而不是SetLayeredWindowAttributes,但我无法找到实现它的方法。
有谁知道如何从我的对话框的圆角删除这些像素?
代码:
INT_PTR CALLBACK WinProc(HWND hh,UINT mm,WPARAM ww,LPARAM)
{
HWND hX = GetDlgItem(hh,123);
switch(mm)
{
case WM_INITDIALOG:
{
// No Dialog Title Bar
SetWindowLong(hh, GWL_STYLE, 0); // With no border around the window
// Transparent Dialog In Selected Color
LONG ExtendedStyle = GetWindowLong(hh, GWL_EXSTYLE);
SetWindowLong(hh, GWL_EXSTYLE, ExtendedStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(hh, RGB(255, 128, 255), 0, LWA_COLORKEY);
//UpdateLayeredWindow(hh, NULL, NULL, NULL, NULL, NULL, RGB(255, 128, 255), 0, ULW_COLORKEY);
// Load the swf from our resources, extract first to temp path
TCHAR dx[1000] = {0};
GetTempPath(1000,dx);
TCHAR df[1000] = {0};
GetTempFileName(dx,L"swf",0,df);
DeleteFile(df);
wcscat_s(df,1000,L".swf");
DeleteFile(df);
ExtractDefaultFile(df,L"flash",0,0,L"data");
SendMessage(hX,AX_INPLACE,1,0);
SendMessage(hh,WM_SIZE,0,0);
// Set the object
IShockwaveFlash* p = 0;
CLSID iidx = __uuidof(IShockwaveFlash);
HRESULT hr = (HRESULT)SendMessage(hX,AX_QUERYINTERFACE,(WPARAM)&iidx,(LPARAM)&p);
if (p)
{
_bstr_t x(df);
hr = p->put_WMode(L"transparent");
hr = p->put_BackgroundColor(RGB(255,128,255));
hr = p->put_Movie(x);
// Notification
AX* iax = (AX*)SendMessage(hX,AX_GETAXINTERFACE,0,0);
if (iax)
{
axCookie = AXConnectObject(iax->OleObject,__uuidof(_IShockwaveFlashEvents),(IUnknown*)&fn,&cpc,&cp);
}
p->Release();
}
break;
}
case WM_SIZE:
{
RECT rc;
GetClientRect(hh,&rc);
SetWindowPos(hX,0,0,0,rc.right,rc.bottom,SWP_SHOWWINDOW);
return 0;
}
case WM_CLOSE:
{
EndDialog(hh,0);
return 0;
}
}
return 0;
}
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
OleInitialize(0);
AXRegister();
DialogBox(hInstance,L"DIALOG_MAIN",0,WinProc);
return 0;
}
我使用其未在闪光灯作为颜色内部使用RGB(255,128,255)的颜色否则它也擦除颜色从闪存播放器内。
在此先感谢
查看WinAPI的“掩蔽”或“剪切区域”。你会想使用:'CreateRoundRectRgn'。 – Brandon
如果您在窗口边缘看到多余的像素,则表示这些像素与您指定的透明度颜色不匹配。例如,如果边缘模糊或消除锯齿,或与其他颜色或阴影混合。 –
是的雷米,你也是对的。看起来,具有透明度和去除WS_EX_LAYERED颜色映射的activex有一些问题,特别是在圆角处,我发现有两个方法,一个是使用CreateRoundRectRgn作为Brandon和xMRi建议的,另一个是避免在加载的activex中使用不透明或alpha混合。不使用阴影,阿尔法混合和其他颜色映射问题的效果是一个很好的解决方案,如果没有它们,可能会出现圆边上的某些像素,最好的方法就像现在一样使用两者。 – Nocs