2010-12-21 2 views
3

Windows API를 사용하여 기본 GUI를 만들고 있는데 문제가 발생했습니다. 먼저 (RGB(230,230,230))을 설정 한 사용자 정의 배경색으로 열리는 기본 창으로 시작합니다. 그런 다음 정적 컨트롤이있는 왼쪽 상단 모서리에 텍스트를 표시합니다.C++의 정적 컨트롤 배경색

settingstext = CreateWindow("STATIC", 
          "SETTINGS", 
          SS_LEFT | WS_CHILD, 
          12, 
          20, 
          100, 
          20, 
          hwnd, 
          NULL, 
          proginstance, 
          NULL); 
ShowWindow(settingstext, 1); 

이 작동하지만 텍스트가 표시 될 때 기본 창에 맞게 그것의 배경을 변경하는 방법이 필요합니다 그렇지 않으면이 조화되지 않는 것처럼 그냥 보인다.

내 질문을 내가 어떻게하면 돼? 저는 현재 아래의 방법을 사용하고 있습니다 만, 저는 알고 싶습니다. 시스템 색상을 변경하지 않고 정적 컨트롤에 대한 CreateWindow 함수 바로 다음에 백그라운드 색상을 어떻게 든 영구적으로 설정하는 방법이 있습니까? 제어하지 말고 WM_CTLCOLORSTATIC 메시지를 보내는 것은 아닙니다. 나는 GetDC 함수를 사용하고 메시지 루프 외부에서 SetBkColor 함수를 사용하여 실험했지만 아무 것도 작동하지 않습니다.

case WM_CTLCOLORSTATIC: 
    { 
    HDC hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(0,0,0)); 
    SetBkColor(hdcStatic, RGB(230,230,230)); 
    return (INT_PTR)CreateSolidBrush(RGB(230,230,230)); 
    } 

내가하고 싶은이 나는 때마다 윈도우 페인트 다시 호출 할 필요가 함수 내 메시지 루프를 입력하지 않으

  • ... 때문이다.
  • 변경 내용을이 정적 컨트롤에만 적용하십시오.

적어도 올바른 방향으로 나를 가리켜 주시면 제공 될 수있는 도움에 대해 매우 감사 할 것입니다. 감사합니다.

+1

'(HWND) lParam == settingstext'을 검사하여 정적 컨트롤에만'WM_CTLCOLORSTATIC' 코드의 효과를 제한 할 수 있습니다. 작성한 모든 브러시가 절대로 삭제되지 않는다는 점에서 예제에 문제가 있습니다. –

답변

10

정적 텍스트 컨트롤의 경우 텍스트 색상이나 배경을 설정할 영구적 인 방법이 없습니다. 단일 정적 컨트롤에 변경 사항을 적용하려는 경우에도 마찬가지입니다. 컨트롤이 그려지기 직전에 부모 dlgproc에서 WM_CTLCOLORSTATIC 알림 메시지를 처리해야합니다.

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230)); 

case WM_CTLCOLORSTATIC: 
{ 
    if (settingstext == (HWND)lParam) 

       //OR if the handle is unavailable to you, get ctrl ID 

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID 
    if (CtrlID == IDC_STATIC1) //If desired control 
    { 
     HDC hdcStatic = (HDC) wParam; 
     SetTextColor(hdcStatic, RGB(0,0,0)); 
     SetBkColor(hdcStatic, RGB(230,230,230)); 
     return (INT_PTR)hBrush; 
    } 
} 

당신은 당신이 SetBkMode(hdcStatic, TRANSPARENT)을 사용할 수있는 부모의 대화를 통해 컨트롤의 배경을 투명하게 만들기 위해 찾고 있다면.

+1

'SetBkColor'를 이미 호출했다면 배경에'hBrush'를 만들어야하는 이유를 설명 할 수 있습니까? 투명한 배경의 경우 투명 브러시가 필요합니까? – Ameen

1

정적 창을 서브 클래 싱하고 소유자를 그리는 것을 고려 했습니까?

+0

그것이 무엇인지 모르기 때문에 서브 클래 싱에 대한 빠른 연구를 할 것입니다. – contrapsych

+0

기본적으로 정적 컨트롤로 보내지는 메시지가 대신 코드로 전달된다는 것을 의미합니다 (처리하지 않은 코드는 원래 처리기로 전달하는 것을 잊지 마십시오). 배경 지우기 및 메시지 페인팅을 처리하는 경우 창에 원하는 내용이 표시되도록 할 수 있습니다. –

+0

그래서 그 하나의 컨트롤에서만 일어날 것입니다, 또한 그 컨트롤에 대한 사용자 지정 프로 시저에서 함수의 수를 줄이는 방법이 있습니다.기본적으로 "전체 프로 시저에서 많은 기능이 없다"는 것은 응용 프로그램을 다시 칠해야 할 때마다 해당 기능을 수행해야하는 응용 프로그램의 속도가 느려지거나 실제로 큰 문제가 아닌 것처럼 보입니다. ? – contrapsych

1

나는 영구적 인 방법이 있다고 생각합니다.

레이블을 만든 직후 GetDC() 함수를 사용하여 장치 컨텍스트를 가져옵니다. 그런 다음 사용

SetTextColor(hdcStatic, RGB(0,0,0)); 
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx. 

그리고 그것은해야한다.