2011년9월22일_winAPI_Label과 비슷한 static컨트롤


image

WLW2010의 글꼴 대화상자를 보면 “글꼴(F):”, “글꼴 스타일(Y):”, “크기(S):”, “색상(C):” 문자열이 보인다.
이들 문자열이 바로 스태틱(static)컨트롤로 주로 다른 컨트롤의 용도를 설명하기 위해 근처에 배치하여 사용한다.
VS2005에서는 Label이라고 부르고 거의 비슷하다.

CreateWindow(TEXT("static"),                                  // 윈도우 클래스 = static = 텍스트
                  TEXT("스태틱 컨트롤 실습 - 배고파~"),      // 화면에 출력할 문자열
                  WS_CHILD | WS_VISIBLE,                    // 차일드윈도우이고 화면에 바로 표시하라
                  10,420,                                           // 윈도우의 시작좌표는 10, 420
                  300,30,                                           // 윈도우의 크기는 300,30
                  hWnd,                                           // 부모윈도우의 핸들
                  (HMENU)-1,                                    // ID를 부여하지 않겠다. ()안은 캐스팅 자료형
                  g_hInst,                                         // 이 프로그램의 인스턴스 핸들
                  NULL);                                           // 지금은 몰라도 됨. (윈도우간 파라미터 전달, 특수목적)


windows API정복 page.222 예제: Static의 소스코드 중 핵심코드만 설명하였다.

단순히 문자열을 출력하는 컨트롤인데 TextOut()와 뭐가 다른가?
TextOut()는 화면에 출력한 문자열이 그냥 문자열일 뿐이므로 언제든지 지워질 수 있고 그래서 WM_PAINT메시지 처리 코드에서,
저장된 문자열을 계속 출력하여 복구시켜야 한다.
반면 스태틱 컨트롤은 스스로 메시지를 처리할 수 있는 윈도우이기 때문에 일단 배치해 놓기만 하면 더 이상 신경 쓰지 않아도 된다.
또한 색상, 글꼴 크기 등 운영체제의 세팅이 바뀔 경우 이런 변화에 대해서도 스스로 대처한다는 장점이 있다.
(컨트롤 == 윈도우)


★ 컨트롤을 잘 다루기 위해서 필요한 컨트롤의 3요소

① 스타일
② 통지메세지
③ 부모 윈도우가 보내는 메세지
(왠지 중요해 보여서 적어 놓음;;;)


● 전체소스코드 중 메시지처리 함수들만 미리보기

   1: //MsgProc.h
   2: #ifndef __MSGPROC_H_
   3: #define    __MSGPROC_H_
   4:  
   5: #include <windows.h>
   6:  
   7: LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
   8: LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
   9: LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
  10: LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
  11: LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam);
  12: LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam);
  13: LRESULT OnLButtonDBLCLK(HWND hWnd, WPARAM wParam, LPARAM lParam);
  14: LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam);
  15: LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam);
  16:  
  17: extern HINSTANCE g_hInst;
  18:  
  19: #endif    //__MSGPROC_H_


   1: //MsgProc.cpp
   2:  
   3: #include "MsgProc.h"
   4:  
   5:  
   6: LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
   7: {
   8:     CreateWindow(TEXT("button"),TEXT("밥주기"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   9:         10,40,100,30,hWnd,(HMENU)1,g_hInst,NULL);
  10:  
  11:     CreateWindow(TEXT("static"),TEXT("스태틱 컨트롤 실습 - 배고파~"),WS_CHILD | WS_VISIBLE,
  12:         10,10,300,30,hWnd,(HMENU)-1, g_hInst, NULL);
  13:     
  14:  
  15:     return 0;
  16: }
  17:  
  18: LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
  19: {
  20:     return 0;
  21: }
  22:  
  23: LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
  24: {
  25:  
  26:     return 0;
  27: }
  28:  
  29: LRESULT OnRButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
  30: {
  31:  
  32:     return 0;
  33: }
  34:  
  35:  
  36: LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
  37: {
  38:  
  39:     return 0;
  40: }
  41:  
  42: LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
  43: {
  44:     return 0;
  45: }
  46:  
  47: LRESULT OnLButtonDBLCLK(HWND hWnd, WPARAM wParam, LPARAM lParam)
  48: {
  49:  
  50:     return 0;
  51: }
  52:  
  53:  
  54: LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
  55: {
  56:     HDC hdc;
  57:     PAINTSTRUCT ps;
  58:  
  59:     hdc = BeginPaint(hWnd, &ps);
  60:     EndPaint(hWnd, &ps);
  61:  
  62:     return 0;
  63: }
  64:  
  65: LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
  66: {
  67:     PostQuitMessage(0);
  68:     return 0;
  69: }

 

전체소스코드 다운로드 -> 0922_Static.zip



image 



● 웃지 못 할 실수

   1:  LPCTSTR lpszClass = TEXT("MyStatic");
   2:  WndClass.lpszClassName = lpszClass;

WinMain()내부…윈도우클래스 구조체를 정의하는 부분에서 클래스의 이름을 “Static”으로 정하니,
아무리 실행해도 컨트롤이 보이지 않았다. (스태틱이외의 어떤 컨트롤도..)
한 30분 동안 코드에 이상이 없나 살펴보아도 없자...
클래스명이 의심스러워 책소스CD를 보니 “MyStatic”이라고 되어 있지 않은가!!
그래서 이름을 바꿔 보니 컨트롤이 화면에 제대로 표시되었다.
대소문자 구분 안하는가 보다!!