개체 지향 프로그래밍 실험 sduwh 하위 창 및 컨트롤의 세 가지 기본 사용, 리소스 사용은 실험 보고서 2를 참조하십시오.

참고용으로만 인터넷에서 수집

실험 3은 두 개의 완전한 보고서를 수집했는데, 이것이 두 번째이고 다른 하나는 이 칼럼의 이전 기사에서 찾을 수 있습니다.

1 실험적 요구 사항
· 전반적인 목적: 이해, 창 간의 메시지 전송, 호출 스택, 커서, 아이콘 및 메뉴를 만들고 사용하는 방법 숙달, 메뉴에 응답하는 방법
, 바로 가기 메뉴 로드 및 사용 방법 숙달,
GetWindowLong/ 사용법 이해 SetWindowLong, GetClassLong/SetClassLong 함수.
· 실험 내용 처리: 1. ChildWin 샘플 프로그램 개선, 서브 윈도우에 윈도우 고유 정보(윈도우 ID 번호) 표시, 각 서브 윈도우에 특정 색상의 사각형 그리기
시도  윈도우 프로시저에서 Refresh 처리 서브 윈도우의 기능 메시지에 처리 코드 추가  GetWindowLong 함수를 사용하여 서브 윈도우 ID 가져오기  서브 윈도우 ID에 따라 서브 윈도우에 표시할 정보 설정(wsprintf 함수 사용) )  서브 윈도우에 특정 색상을 그려보기 2. 메시지 전달 과정 추적 차일드 메인 윈도우 처리 함수의 WM_CREATE, WM_PAINT, WM_COMMAND, WM_LBUTTONDOWN에 중단 점 설정  WM_CREATE, WM_PAINT에 중단점 설정 , WM_CHILDWIN, WM_LBUTTONDOWN of Childwin  를 클릭하여 프로그램을 실행하고 각 중단점의 응답 프로세스를 확인하여 메시지 전달 순서를 이해합니다. 3. 소프트 키보드 설계 및 구현













하위 창을 사용하여 소프트 키보드를 구현하고(창의 클라이언트 영역에서 하위 창으로 모의 키보드를 그립니다)
마우스로 각 하위 창을 클릭하여 다른 문자를 입력합니다. 입력한 문자를 창에 표시합니다.
4. 제어 테스트를 위해 작업 디렉토리에 새 프로젝트를 생성합니다(Easywin 프로젝트의 easywin.c를
새 프로젝트의 디렉토리에 복사하고 파일 이름을 ctltest.cpp로 수정(접미사를 .cpp로 변경). 컴파일, 링크 및 프로그램
작동(컴파일 오류 수정 포함)].
5. * 버튼을 사용하여 4*에서 요구하는 소프트 키보드를 완성합니다. 원래 구현과 차이점을 비교하십시오.
6. 정적, 편집, 목록 상자, 콤보 상자, 버튼, 스크롤바 등을 포함하여 다양한 유형의 제어 하위 창을 만들고
메인 창의 창 프로시저 기능에 해당 메시지 처리를 추가하여 메인 창과 하위 창
( 컨트롤의 제목/내용을 설정하고, 컨트롤의 제목/내용을 가져오고,
컨트롤에 클릭과 같은 작업이 있을 때 기본 창에 프롬프트를 표시하십시오).
7. 5단계와 동일하게 리소스 테스트를 위한 새 프로젝트를 만듭니다.
8. 새 리소스 추가: 커서, 아이콘 및 올바르게 표시
 리소스 편집기를 사용하여 커서(색상)를 편집하고 리소스에서 불필요한 이미지 유형을 삭제하지 않으면
커서가 올바르게 표시되지 않을 수 있습니다.
 커서에 대한 핫스팟 설정
 리소스 편집기로 아이콘 편집
 등록된 윈도우 클래스의 코드를 프로그램이 커스텀 커서와 아이콘을 정상적으로 사용할 수 있도록 수정
 DrawIcon 함수를 사용하여 WM_PAINT 메시지에 처리 추가, 창의 클라이언트 영역에
사용자 지정 개체 지향 프로그래밍 기술 실험 보고서가
2
커서 및 아이콘.
 후속 실험 단계를 위해 다른 커서 생성
9. 메뉴 추가
 창에서 사용하는 커서를 수정하기 위해 메뉴 항목 명령을 "ChangeCursor"라고 명명할 수 있으며 해당
ID는 ID_CHANGECURSOR로 가정
 수정 등록된 윈도우 클래스의 코드, 프로그램 실행 시 메뉴가 정상적으로 로드될 수 있도록 함
또 다른 방법은 CreateWindow(CreateWindow)의 코드를 수정하여 메뉴가 정상적으로 로드될 수 있도록 함
10. 메뉴 메시지 응답 코드 증가
 WM_COMMAND의 메시지 처리
Chapter 5 메뉴 참조 메뉴 명령에 대한 샘플 코드의 처리 방법
 ID_CHANGECURSOR 명령에 대한 응답은 다음과 같습니다. 창에서 사용하는 커서를 변경하려면
SetClassLong(hwnd, GCL_HCURSOR,
(LONG )LoadCursor((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDC_CURSOR2 ) ) );
11. 마우스 오른쪽 버튼 처리 및 바로 가기 메뉴 처리 추가
 오른쪽 버튼으로 내린 메뉴 명령도 WM_COMMAND 메시지를 통해 응답 바로가기 메뉴 추가 후
프로그램은 메인 메뉴 또는 바로가기 메뉴를 통해 동일한 명령을 내릴 수 있어야 함
12. 프로그램 구축에 사용되는 배치 파일에 본 실험에서 완성한 프로젝트의 컴파일 및 링크를 추가하고 사용
실험 1, 2, 3의 모든 프로젝트를 한 번에 자동으로 빌드하는 배치 파일 .

2 실험 과정 및 결과


2.1 ChildWin 샘플 프로그램 개선,
하위 창에 창별 정보(창 ID 번호) 표시, 각 하위 창에 특정 색상의 사각형 그리기 시도 그림과
같이 id 번호를 표시하고 녹색 사각형

2.2 메시징 프로세스 추적

1. ChildWin 메인 윈도우 처리 함수의 WM_CREATE, WM_PAINT, WM_COMMAND, WM_LBUTTONDOWN에 중단점 설정

·WM_CREATE:

윈도우 생성시 중단


WM_COMMAND:
자식 창을 치면 프로그램이 중단됩니다.
 
WM_LBUTTONDOWN:
마우스 왼쪽 버튼을 누르면 프로그램이 중단됩니다.

2. 하위 창
WM_CREATE의 WM_CREATE, WM_PAINT, WM_CHILDWIN, WM_LBUTTONDOWN에 중단점을 설정합니다.


WM_PAINT:
메인 윈도우가 정상적으로 그려지고 표시되며, 서브 윈도우가 그려지기 전에 인터럽트가 발생합니다. 프로세스별 작업에서는 첫 번째 하위 창부터 시작하여 WM_PAINT 주기로 하나씩 그려서 표시합니다.
 
WM_CHILDWIN:
마우스가 하위 창에 닿으면 기본 창은 알림 메시지를 수신하고 WM_CHILDWIN에 알림 메시지를 보내 중단을 생성합니다.
 
WM_LBUTTONDOWN:
 
3. 프로그램을 실행하고 각 중단점의 응답 프로세스를 확인하여 순서를 이해합니다. 메시지 전달 :
중단점을 설정하고 해당 디버깅을 수행한 후 마우스 왼쪽 버튼이 하위 창에 닿았을 때 하위 창의 WM_LBUTTONDOWN이 응답을 생성하고 메인 창인 WM_COMMAND에 메시지를 보내고 WM_COMMAND가 a를 보내는 것을 알 수 있습니다. WM_CHILDWIN은 서브 윈도우가 적중된 것을 확인한 후 서브 윈도우에 메시지를 보내고, WM_CHILDWIN은 메시지를 수신한 후 자식 윈도우 히트 플래그를 0으로 설정합니다.


2.3 소프트 키보드를 설계 및 구현하고 각 하위 창을 마우스로 클릭하여 다른 문자를 입력하고 입력된 문자를 창에 표시
 

 


2.4 제어 테스트를 위한 새 프로젝트 생성, Easywin 프로젝트의 easywin.c를 새 프로젝트의 디렉토리에 복사, 파일 이름을 ctltest.cpp로 수정(접미사를 .cpp로 변경), 컴파일, 링크 및 프로그램 만들기 정상적으로 작동합니다(컴파일 오류 수정 포함).
 
 

 

 

 

 

2.5 *버튼을 사용하여 4*에서 요구하는 소프트 키보드 구현 완료

 


2.6 다양한 유형의 제어 하위 창을 만들고 메인 창의 창 프로시저 기능에 해당 메시지 처리를 추가하여 메인 창과 하위 창 간의 통신을 실현합니다.


테스트를 위해 EDIT, LISTBOX, BUTTON 창 만들기:
1. EDIT 창은 텍스트 입력을 구현할 수 있습니다. 2.
 
LISTBOX 창은 행을 클릭할 때 현재 옵션 값을 표시하는 창을 팝업합니다.
 
3. BUTTON 창이 팝업됩니다. 마우스 왼쪽 버튼을 클릭한 후 창 프롬프트 버튼이 눌렸습니다:
 
2.7 리소스 테스트를 위한 새 프로젝트 만들기
 
2.8 새 리소스 추가: 커서, 아이콘 및 올바르게 표시
1. 리소스 편집기를 사용하여 커서(색상) 편집
  
2. 커서에 대한 핫스팟 설정(핫스팟)
 
3. 리소스 편집기로 아이콘 편집

 

 

 

 

 

 

4. 등록된 윈도우 클래스의 코드를 프로그램이 커스텀 커서와 아이콘을 정상적으로 사용할 수 있도록 수정

 

5. DrawIcon 기능을 사용하여 WM_PAINT 메시지에 처리를 추가하고 창의 클라이언트 영역에 사용자 지정 커서와 아이콘을 표시합니다.

 

6. 후속 실험 단계를 위한 추가 커서 생성


 
2.9 메뉴 추가
1. 창에서 사용하는 커서를 수정하기 위해 메뉴 항목 명령을 "ChangeCursor"로 명명할 수 있으며 해당 ID는 ID_CHANGECURSOR로 가정합니다.
 

 

 

 

2. 등록된 윈도우 클래스의 코드를 수정하여 프로그램 실행시 메뉴를 정상적으로 불러올 수 있도록 수정
 


 
3. 다른 방법으로 CreateWindow의 코드를 수정하여 메뉴를 올바르게 로드할 수 있습니다.
 
 
2.10 메뉴 메시지 응답 코드 추가 WM_COMMAND 메시지 처리 추가, ID_CHANGECURSOR 명령에 대한 응답은 다음과 같습니다. 커서 메뉴 명령 변경
창에서 사용하는 2.11 마우스 오른쪽 버튼 처리 및 바로가기 메뉴 처리 추가 오른쪽 버튼으로 내린 메뉴 명령도 WM_COMMAND 메시지를 통해 응답 바로가기 메뉴 추가 후 프로그램은 메인 메뉴 또는 바로가기 메뉴를 통해 동일한 2.12 이 실험 완성된 프로젝트의 컴파일 및 링크는 프로그램 구축에 사용되는 배치 파일에 추가되며 실험 1, 2, 3의 모든 프로젝트는 배치 파일로 한 번에 자동으로 빌드됩니다. 3 실험 요약 이 실험은 이전 두 실험보다 훨씬 더 어렵고 스스로 생각하고 탐색해야 하는 부분이 추가되었으며, 바로 이 때문에 이 실험에서 많은 것을 얻었습니다. 1. I GetWindowLong 과 같은 기능에 대한 더 깊은 이해 자식 창의 ID 추출에서 사각형 그리기에 이르기까지 관련 기능 적용 및 중단점 디버깅을 통해 메시지 알림 연결 및 관련 작업에 대해 더 철저히 이해합니다. 부모 창과 자식 창.부모 창과 자식 창의 관계는 간결하고 효과적으로 원하는 것을 얻을 수 있습니다. 2. 소프트 키보드의 설계 및 구현을 통해 자식 창의 선택 및 해제와 부모 창의 해당 작업에 대해 자세히 배웠습니다. 그리고 소프트 키보드를 만드는 과정에서 서브 윈도우의 배치에 대해서도 고민을 많이 했고, 나름의 탐구와 실험 끝에 더욱 아름다운 소프트 키보드를 만들기 위해 노력했고 일종의 성과도 얻었다. 열심히 실험하는 과정에서 느껴보세요. 돌이켜보면 소프트키보드 제작은 복잡하지 않은데 그전에는 아직 저에게 막막한 프로젝트였고, 처음부터 소프트키보드를 만드는 과정에서도 학습과 지식이 쌓이는 과정을 목격했습니다.
 

 


 

 




3. 컨트롤 테스트 부분은 수업에 있는 프로그램 예제의 확장이라 어렵지 않습니다. 학습해야 할 주요 지식은 각 공간의 구조, 창에 쓰는 방법, 이를 달성하기 위해 적용하는 방법입니다. 원하는 효과.
4. 리소스 테스트는 위와 동일하며 선생님의 참을성 있는 설명으로 실험에 필요한 대부분의 기능을 수업시간에 구현할 수 있습니다. 자원.
5. 이전 두 부분과 비교하여 메뉴 부분에서 약간의 어려움이 있었습니다. 수업에서 교사의 조작에 따라 메뉴의 설정 및 참조가 구현되지 않았으며 메뉴 기능의 구현 부분에서 실험에 따르면 SetClassLong 기능도 여러 번 시도한 후에 구현될 수 있습니다. 상대적으로 시간이 많이 소요되는 부분은 바로가기 메뉴의 제작 및 사용에 있어 자습 및 제작이 필요합니다. 정보를 참고하고 지속적으로 시도한 끝에 마침내 바로 가기 메뉴에서 커서를 변경하는 작업을 완료했습니다.
6. 일반적으로 이 실험은 비교적 성공적입니다. 시간이 많이 걸리지만 대부분의 프로젝트는 내 노력으로 완료됩니다. Windows 프로그래밍에 대한 지식을 더 깊이 이해하고 있습니다. 프로젝트의 실현도 저를 내가 지불하면 보상받을 것이라고 생각합니다. 그러나 동시에 실험의 더딘 진행으로 인해 프로젝트로 선정된 BUTTON 소프트 키보드는 실현되지 못하였습니다. .

 

 부록: 키 코드

 

 

 

 

GetWindowLong 함수를 사용하여 자식 창 ID를 가져옵니다.

서브 윈도우 ID에 따라 서브 윈도우에 표시할 정보 설정 (wsprintf 함수를 사용하여 표시할 문자열 정리)

    int number = GetWindowLong ( hWnd , GWL_ID ); // 자식 창 ID 가져오기

    문자열 [20];

    wsprintf (문자열, TEXT ( "%d" ), 숫자);

케이스 WM_PAINT :

DrawText (hdc, string,         // 서브 윈도우 ID 번호 표시

            -1, &rect, DT_SINGLELINE | DT_센터 | DT_VCENTER );

특정 색상의 사각형 그리기

    HBRUSH h컬러펜;

    HGDIOBJ   hGdiobj;

hColorPen = CreateSolidBrush( RGB (10, 100, 100)); // 브러시 생성 및 색상 선택

    hGdiobj = SelectObject(hdc, hColorPen); // 선택한 영역을 브러시로 그린다.

    직사각형(hdc, 5, 20, 45, 45);

DeleteObject(hColorPen); // 브러시 해제

소프트 키보드 설계 및 구현:

#define ROW_NUM 4    // 행 수

#define COL_NUM 16   // 열 수

INT t = 0; // 서브 윈도우 최초 선택 시 1이 되는 글로벌 변수 t는 소프트 키보드 초기 상태에서 문자 입력을 피하기 위해 사용

LRESULT CALLBACK MainWndProc( HWND hWnd , UINT 메시지 , WPARAM wParam , LPARAM lParam )

{

    static HWND hChildWnd[ COL_NUM ][ ROW_NUM ];  // 자식 창 핸들

    static int   nXBox, nYBox;                 // 하위 창 너비 및 높이

    static WORD nChildWin_ID;                 // 히트 자식 창의 ID

    static int   nRow, nCol;                   // 적중 하위 창의 위치(즉, 행 및 열 번호)

    정수          x, y;

WNDCLASS     wcChild;                      // 자식 창 클래스

   

스위치 ( 메시지 )

{

케이스 WM_CREATE :

...

// "그리기" 프로그램의 그리기 도구 모음과 유사한 각 도구 하위 창을 만듭니다.

for (y = 0; y < ROW_NUM; y++)

            for (x = 0; x < COL_NUM; x++)

            {

                nChildWin_ID = y << 4 | x;             // 자식 창 ID 값은 y * 2^4 +4와 같습니다.

                hChildWnd[x][y] = CreateWindow (szChildName, NULL ,

                    WS_CHILDWINDOW | WS_DLGRAME | WS_VISIBLE ,

                    0, 0, 0, 0,

                    hWnd ,

                    ( HMENU )(nChildWin_ID), // 자식 창 id 번호

                    //0,

                    hInst, NULL );

}

0을 반환합니다 .

케이스 WM_SIZE :

        nXBox = ( LOWORD ( lParam )*4/5)/ COL_NUM ;

        nYBox = ( HIWORD ( lParam )*2/5) / ROW_NUM ;

// 메인 윈도우의 크기가 변경되면 메인 윈도우의 클라이언트 영역에서 각 서브 윈도우의 위치를 ​​다시 결정

        for (y = 0; y < ROW_NUM; y++)

            for (x = 0; x < COL_NUM; x++)

            {

                MoveWindow(hChildWnd[x][y], (x * nXBox + LOWORD ( lParam )/10),

                    (y * nYBox + HIWORD ( lParam ) / 3), nXBox, nYBox, TRUE ); //xy 너비와 높이

            }

0을 반환합니다 .

case WM_COMMAND :                // 자식창이 떴다는 알림 메시지

        // 메인 윈도우가 다른 서브 윈도우가 히트되었는지 여부를 결정할 수 있도록 서브 윈도우가 히트할 때 메인 윈도우에 알리기 위해 이 메시지를 전송합니다.

        // 그렇다면 이전에 히트한 서브 윈도우의 상태를 변경하도록 서브 윈도우 함수에 알리는 메시지를 보내고,

        if (!( LOWORD ( wParam ) == nChildWin_ID))

        {

            SendMessage (( HWND )hChildWnd[nCol][nRow], WM_CHILDWIN , 0, 0L);

            // 새로운 히트 자식 창을 기록합니다.

            nChildWin_ID = LOWORD ( wParam );

            nCol = (nChildWin_ID > 15) ? (nChildWin_ID - 16) : nChildWin_ID;

            nRow = nChildWin_ID >> 4;             

        }

        InvalidateRect( hWnd , NULL , TRUE );

    0을 반환합니다 .

케이스 WM_PAINT :

        if (t)// 자식 창에 도달한 후 해당 문자를 그리기 시작하고 표시합니다.

        {

            HDCHDC          ;

            PAINTSTRUCT ps;

            RECT         렉;

            l = 0;

            GetClientRect( hWnd , &rect);

            hdc = BeginPaint( hWnd , &ps);

            정수 번호 = nChildWin_ID;

            정적 문자 문자열[100] = { 0 };

            정적 정수 n = 0;

            문자열[n] = 숫자 + 65;

            n++;

            DrawText (hdc, 문자열, n, &rect, DT_SINGLELINE );

            EndPaint( hWnd , &ps);

        }

    0을 반환합니다 .

....

   

DefWindowProc ( hWnd , 메시지 , wParam , lParam ) 반환 ;

} // 함수 WinProc 종료

LRESULT CALLBACK ChildWndProc( HWND hWnd , UINT 메시지 , WPARAM wParam , LPARAM lParam )

{

...

케이스 WM_LBUTTONDOWN :

        // 새 자식 창에 도달했습니다.

        if ( GetWindowLong ( hWnd , 0) == 0)

        {

            t = 1;

            // 자식 창 적중 플래그를 1로 설정

            SetWindowLong ( hWnd , 0, 1);

            // 메인 창에 알리기 위해 메시지를 보냅니다.

            SendMessage (GetParent( hWnd ), WM_COMMAND ,

                //(WPARAM) MAKELONG ((WORD)GetWindowWord (hWnd, GWL_ID), (WORD)0),

                GetWindowLong ( hWnd , GWL_ID ),

                ( LPARAM ) hWnd );

            // 자식 창의 클라이언트 영역을 다시 그립니다.

            GetClientRect( hWnd , &rect);

            InvalidateRect( hWnd , &rect, TRUE );

        }

    0을 반환합니다 .

case WM_CHILDWIN :          // 메인 윈도우에서 보낸 알림 메시지는 원래 히트한 자식 윈도우의 상태를 변경합니다.

        // 자식 창 적중 플래그를 0으로 설정

        SetWindowLong ( hWnd , 0, 0);

        // 자식 창의 초기 디스플레이 모드를 복원합니다.

        GetClientRect( hWnd , &rect);

        InvalidateRect( hWnd , &rect, TRUE );

0을 반환합니다 .

    케이스 WM_PAINT :

        hdc = BeginPaint( hWnd , &ps);

        GetClientRect( hWnd , &rect);

        Rectangle(hdc, 10, 10, 40, 40); // 왼쪽 높이 오른쪽 바닥

         for ( int j = 0; j < COL_NUM; j++)

            for ( int i = 0; i < ROW_NUM; i++) //列数

            {

                문자 szBuff[50];

                문자 키 = GetWindowLong ( hWnd , GWL_ID ) + 65;

                wsprintf (szBuff, TEXT ( "%c" ), key); // 서브 윈도우의 글자를 그린다.

                DrawText (hdc, szBuff,

                    -1, &rect, DT_SINGLELINE | DT_센터 | DT_VCENTER );

            }

EndPaint( hWnd , &ps);

0을 반환합니다 .

사례 WM_DESTROY :

        PostQuitMessage(0);

        0을 반환합니다 .

    }

DefWindowProc ( hWnd , 메시지 , wParam , lParam ) 반환 ;

} // 함수 ChildWinProc 종료

다양한 유형의 제어 하위 창을 만들고 메인 창의 창 프로시저 기능에 해당 메시지 처리를 추가하여 메인 창과 하위 창 간의 통신을 실현합니다.

#define ITEMCOUNT 5

WCHAR gListItems[ ITEMCOUNT ][60] = {

    L"MSG 메시지;" ,

    L"if (!InitWindow(hInstance, iCmdShow))" ,

    L"거짓 반환;" ,

    L"GetMessage (&msg, NULL, 0, 0)" ,

    좋아요"

};

LRESULT CALLBACK WinProc ( HWND hWnd , UINT 메시지 , WPARAM wParam , LPARAM lParam )

{

....

스위치 ( 메시지 )

    {

        case WM_CREATE :         // 메시지 생성

            hWndEdit = CreateWindow ( TEXT ( "EDIT" ),                   //EDIT

                NULL ,                                // 제목 없음

                WS_CHILD | WS_VISIBLE | WS_HSCROLL |    // 제어 스타일 편집

                WS_VSCROLL | WS_BORDER | ES_LEFT |

                ES_MULTILINE | ES_AUTOSCROLL |

                IS_AUTOVSCROLL ,

                0, 0, 0, 0,

                hWnd ,                                // 부모 윈도우 핸들

                ( HMENU )1,                            // 제어 서브 윈도우 ID 수정

                ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ),

                NULL );

            hWndList = CreateWindow ( TEXT ( "LISTBOX" ),                    //LISTBOX                 NULL ,                                // 제목 없음

                WS_CHILD | WS_VISIBLE | LBS_STANDARD ,   // 제어 스타일 편집

                0, 0, 0, 0,

                hWnd ,                                // 부모 윈도우 핸들

                ( HMENU )2,                            // 제어 서브 윈도우 ID 수정

                ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ),

                NULL );

            hWndButton = CreateWindow ( TEXT ( "버튼" ),                  //버튼

                NULL ,                                // 제목 없음

                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,

                0, 0, 0, 0,

                hWnd ,                                // 부모 윈도우 핸들

                ( HMENU )3,                            // 제어 서브 윈도우 ID 수정

                ( HINSTANCE ) GetWindowLong ( hWnd , GWL_HINSTANCE ),

                NULL );

            for ( int i = 0; i < ITEMCOUNT; i++)

            {

                SendMessage (hWndList, LB_ADDSTRING , 0, ( LPARAM )gListItems[i]);

            }

            0을 반환합니다 .

       

케이스 WM_SIZE :

            MoveWindow(hWndEdit, 0, 0, LOWORD ( lParam ) / 3, HIWORD ( lParam ), TRUE );

            MoveWindow(hWndList, LOWORD ( lParam ) / 3 + 2, 0, LOWORD ( lParam ) / 3 - 5, HIWORD ( lParam ), TRUE );

            MoveWindow(hWndButton, 2* LOWORD ( lParam )/3+2 , 0, 2* LOWORD ( lParam )/3-5 , HIWORD ( lParam ), TRUE );

    0을 반환합니다 .

케이스 WM_COMMAND :

            단어 w, W1, W2, W3;

            w = LOWORD ( wParam );

            W1 = HIWORD ( wParam );

            W2 = LOWORD ( lParam );

            W3 = HIWORD ( lParam );

            // 제어 알림 메시지 편집

            if (( LOWORD ( wParam )) == 1)

            {

            }

            그렇지 않으면 (( LOWORD ( wParam )) == 2)

            {

                if ( HIWORD ( wParam ) == LBN_SELCHANGE )

                {

                    WCHAR msg[32];

                    UINT u = SendMessage (( HWND ) lParam , LB_GETCURSEL , 0, 0);

                    wsprintf (msg, L"%d" , u);

                    MessageBox ( hWnd , msg, L"SEL" , MB_OK );

                }

            }

            그렇지 않으면 (( LOWORD ( wParam )) == 3)

            {

                MessageBox ( hWnd , TEXT ( "버튼을 눌렀습니다!" ), TEXT ( " 창 메시지" ), MB_OK );

            }

            0을 반환합니다 .

        사례 WM_DESTROY :

            PostQuitMessage(0);

            0을 반환합니다 .

    }

    // 기본 메시지 핸들러 호출

    DefWindowProc ( hWnd , 메시지 , wParam , lParam ) 반환 ;

} // 함수 WinProc 종료

프로그램이 사용자 지정 커서 및 아이콘을 정상적으로 사용할 수 있도록 등록 창 클래스 코드를 수정합니다.

    wcMainWnd.hIcon = LoadIcon ( hInstance , MAKEINTRESOURCE ( IDI_ICON1 ));// 아이콘

    wcMainWnd.hCursor = LoadCursor ( hInstance , MAKEINTRESOURCE ( IDC_CURSOR1 ));//光定

DrawIcon 기능을 사용하여 WM_PAINT 메시지에 처리를 추가하고 창의 클라이언트 영역에 사용자 지정 커서 및 아이콘을 표시합니다.

HICON         hIcon = LoadIcon (hInstance, MAKEINTRESOURCE ( IDI_ICON1 ));

HCURSOR       hCursor = LoadCursor (hInstance, MAKEINTRESOURCE ( IDC_CURSOR1 ));

...

DrawIcon(hdc, 160, 80, hIcon);

DrawIcon(hdc, 100, 80, hCursor);

마우스 오른쪽 버튼 처리, 바로 가기 메뉴 처리 추가

HMENU hSubMenu; // 전역 변수

정적 BOOL InitWindow( HINSTANCE hInstance , int iCmdShow )

{

    ...

    HMENU hMenu = LoadMenu ( hInstance , MAKEINTRESOURCE ( IDR_MENU2 ));

    hSubMenu = GetSubMenu(hMenu, 1);

.....

}

LRESULT CALLBACK WinProc ( HWND hWnd , UINT 메시지 , WPARAM wParam , LPARAM lParam )

{

...

case WM_RBUTTONDOWN :        // 마우스 메시지

        GetCursorPos(&stPos); // 커서 위치 구하기

        TrackPopupMenu(hSubMenu, TPM_LEFTALIGN , stPos.x, stPos.y, NULL , hWnd , NULL ); // 지정된 위치에 바로 가기 메뉴 표시

    0을 반환합니다 .

...

}

추천

출처blog.csdn.net/qq_22471349/article/details/131013607