2011-05-08 4 views
4

시스템 트레이에 텍스트를 표시하는 아이콘을 만들려고합니다. 이 코드투명도가있는 32 비트 트레이 아이콘을 어떻게 만듭니 까? (GDI 사용)?

#include <tchar.h> 
#include <Windows.h> 
#include <Windowsx.h> 

static HICON CreateIcon(LPCTSTR txt) { 
    HICON hIcon = NULL; 
    HDC hDC = NULL; { 
     HDC hDCScreen = GetDC(NULL); 
     if (hDCScreen != NULL) { 
      __try { hDC = CreateCompatibleDC(hDCScreen); } 
      __finally { ReleaseDC(NULL, hDCScreen); } 
     } 
    } 
    if (hDC != NULL) { 
     __try { 
      HFONT hFont = CreateFontIndirect(&ncm.lfMessageFont); 
      if (hFont != NULL) { 
       __try { SelectFont(hDC, hFont); } 
       __finally { DeleteFont(hFont); } 
      } 
      int width = GetSystemMetrics(SM_CXSMICON), 
       height = GetSystemMetrics(SM_CYSMICON); 
      HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height); 
      if (hBmp != NULL) { 
       __try { 
        HBITMAP hMonoBmp = 
         CreateCompatibleBitmap(hDC, width, height); 
        if (hMonoBmp != NULL) { 
         __try { 
          RECT rect = { 0, 0, width, height }; 
          HGDIOBJ prev = SelectObject(hDC, hBmp); 
          __try { 
           SetBkMode(hDC, TRANSPARENT); 
           SetTextColor(hDC, RGB(255, 255, 255)); 
           ICONINFO ii = { TRUE, 0, 0, hMonoBmp, hBmp }; 
           int textHeight = 
            DrawText(hDC, txt, _tcslen(txt), &rect, 0); 
           if (textHeight != 0) { 
            hIcon = CreateIconIndirect(&ii); 
           } 
          } __finally { SelectObject(hDC, prev); } 
         } __finally { DeleteObject(hMonoBmp); } 
        } 
       } __finally { DeleteObject(hBmp); } 
      } 
     } __finally { DeleteDC(hDC); } 
    } 
    return hIcon; 
} 

: 지금까지 해봤

을 (. 물론, 그것은 문자의 몇 가지 이상되지 않습니다)

static void _tmain(int argc, TCHAR* argv[]) { 
    HICON hIcon = CreateIcon(_T("Hi")); 
    if (hIcon != NULL) { 
     __try { 
      NOTIFYICONDATA nid = { sizeof(nid) }; 
      nid.hWnd = GetConsoleWindow(); 
      BOOL success = Shell_NotifyIcon(NIM_ADD, &nid); 
      if (success) { 
       nid.uFlags = NIF_ICON; 
       nid.hIcon = hIcon; 
       success = Shell_NotifyIcon(NIM_MODIFY, &nid); 
      } 
     } __finally { DestroyIcon(hIcon); } 
    } 
} 

하지만 내가 가진 전부입니다 검정색 바탕에 흰색 텍스트의 Hi이라고하는 단색 비트 맵. (RGB(255, 255, 255)을 약간 변경하더라도 RGB(255, 255, 254)라고하면 흑백입니다.

아이디어가 있으십니까?

(* 참고 : 저는 MFC, ATL, 또는 다른 라이브러리 솔루션을 찾고하지해요, 단지는 Win32/GDI 호출합니다.)


편집 : 여기

무엇을의

+0

하는 것으로, 그리고는 "시스템 트레이"라고 한 적이있다 :

코드 예는 여기에 제공됩니다. 작업 표시 줄 ** 알림 영역 **입니다. –

+1

@Cody : 예, [왜 두 개의 음절을 사용합니까?] (http://support.microsoft.com/kb/162613) 9시를 할 때? – Mehrdad

+1

불행히도 영어에서는 음절의 수와 편의성이 문구의 정확성을 결정하는 주요 요인이 아닙니다. 이 영역을 알림 영역이라고합니다. [Raymond Chen의 블로그 기사] (http://blogs.msdn.com/b/oldnewthing/archive/2003/09/10/54831.aspx)는 관례적인 참고 자료입니다. 관련 기능이 "알림 아이콘"을 참조하는 이유를 궁금해 본 적이 있습니까? 예, 정확하지 않은 제목의 지식 기반 기사를 발견했습니다. 그 중 많은 것들이 존재합니다. 거기에 단순히 잘못된 정보와 함께, 특히 그것은 VB에 대한 기사에 관한 몇 가지 있습니다. –

답변

4

내가 고전 불러 경우는 현재처럼 보인다 곧바로, 부분적으로 투명한 아이콘 (내가 원한 것이라고 생각하는)은 마스크를위한 흑백 비트 맵을 가지고있다. 이 마스크는 무시되지만 여전히 제공해야합니다. 모노크롬 비트 맵을 만들지 않으면 32bpp 비트 맵을 만드는 것처럼 보입니다. 또한 내가 쓰지 않는 영역이 투명 해 지도록 메인 비트 맵의 ​​알파 값을 초기화하는 곳을 어디에도 알 수 없습니다. 그것이 "시스템 트레이"라고 아니에요 How To Create an Alpha Blended Cursor or Icon in Windows XP

+0

@David : 투명성으로 예, 저는 전통적인 투명 마스크 스타일 투명성이 아닌 알파 투명성을 의미했습니다. 나는 실제로 그것을 코드하는 방법에 대해 혼란스러워한다. ... 호환되는 비트 맵과 DIB를 가진이 모든 엉망진창은 메모리 DC를 사용하지 않는 한 보통 흑백이다. (어떤 경우에는 색상이되어야한다. 있는 것 같다) 나를 정말로 혼란스럽게한다. 내가 할 수있는 어떤 예를 알게 되는가? 또한, 알파 값을 어디에도 초기화하지 않았지만 실제로는 그렇습니다.하지만 배경뿐만 아니라 텍스트에 문제가 있기 때문에 어떻게 차이가 나는지 잘 모르겠습니다. – Mehrdad

+0

@Mehrdad 지금 당장 묶여있어 다른 사람이 당신에게 더 자세한 도움을 줄 수는 있지만, 현재 코드에 적어도 두 가지 문제가 있다고 생각됩니다. –

+0

@ David : 그래, 고마워, 내가 알파 비트를 설정하려고합니다. (만약 비트 맵이 단색이라면 잘 될지 모르겠다. 나는 약간의 버퍼를 오버런시키지 않기를 바란다.하지만 감사하겠다.) – Mehrdad