2017-09-25 59 views
2

我想删除一些像素是在具有圆角和我找不到在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)的颜色否则它也擦除颜色从闪存播放器内。

在此先感谢

+3

查看WinAPI的“掩蔽”或“剪切区域”。你会想使用:'CreateRoundRectRgn'。 – Brandon

+1

如果您在窗口边缘看到多余的像素,则表示这些像素与您指定的透明度颜色不匹配。例如,如果边缘模糊或消除锯齿,或与其他颜色或阴影混合。 –

+0

是的雷米,你也是对的。看起来,具有透明度和去除WS_EX_LAYERED颜色映射的activex有一些问题,特别是在圆角处,我发现有两个方法,一个是使用CreateRoundRectRgn作为Brandon和xMRi建议的,另一个是避免在加载的activex中使用不透明或alpha混合。不使用阴影,阿尔法混合和其他颜色映射问题的效果是一个很好的解决方案,如果没有它们,可能会出现圆边上的某些像素,最好的方法就像现在一样使用两者。 – Nocs

回答

2
  1. 创建区域机智Win32函数。即CreateEllipticRegion,CreateRectRgn ...
  2. 比你必须使用SetWindowRgn。

这是一个纯粹的Win32讨论link。在这里,一个link MFC样本。应该很容易将其转移到WinAPI纯粹

+0

感谢布兰登和xMRi的链接,是的,它通过在flash hwnd设置一个带有圆角的区域来工作,它删除了坏像素,但结果是一些像素化的角落,但至少它完成了工作:)谢谢 – Nocs