windows 개발 수첩 프로그램 기록(2)논리 편 1

1.주요 내용
이 절 부터 windows 개발 이 수첩 프로그램의 논리 적 실현 부분 을 소개 한다.이 절의 주요 내용 은 다음 과 같은 세 가지 가 있다.
1.메 인 창 정의-메모 장 메 인 인터페이스 창 에 대응 하 는 창 클래스 와 실현 방안 을 소개 합 니 다.
2.RichEdit 컨트롤 의 선택 및 초기 화―메모 장 프로그램 에서 편집 컨트롤 의 선택 및 사용
3.전체 프로그램 ICON 의 선택.프로그램 ICON 설정
2.실제 개발
2.1 주 창 구현
이전 소개 인터페이스의 실현 에 있어 서 실행 인터페이스의 효 과 를 보 여 주 었 을 뿐,당시 그 인터페이스 프로그램 은 windows 메시지 에 응답 할 수 없 었 습 니 다.당시 창 이 생 성 될 때 창 에 대응 하 는 프로 세 스 처리 함 수 를 NULL 로 설정 하기 때 문 입 니 다.현재,우 리 는 해당 하 는 프로 세 스 처리 함 수 를 추가 해서 이 메모 장 응용 프로그램 이 우리 가 보 낸 일련의 조작 명령 에 응답 할 수 있 도록 해 야 한다.이 를 위해 본 고 는 개발 할 때 메 인 인터페이스 창 을 저장 하 는 클래스 CMainWnd 를 단독으로 설계 했다.이 클래스 는 전체 창의 프로 세 스 처리 함수 Main 을 정의 합 니 다.Porc。메 인 에서Proc 에 서 는 들 어 오 는 모든 메 시 지 를 처리 할 수 있 습 니 다(창 메시지 초기 화,창 에 있 는 다른 컨트롤 메시지,창 메시지 닫 기 등 포함).windows 자체 수첩 을 예 로 들 면 그림 1 과 같다.

그림 1 윈도 우즈 메 인 창 메시지 효과 영역
위의 그림 에서 보 듯 이 windows 메모 장 메 인 인터페이스 에 서 는 빨간색 사각형 영역 내 메뉴 컨트롤 의 각종 메시지,노란색 사각형 영역 내 시스템 버튼 에 대한 정보,그리고 해당 편집 컨트롤 Edit 의 메 시 지 를 응답 해 야 합 니 다.주 창의 각종 컨트롤 에 대한 정 보 는 윈도 우즈 에서 WMCOMMAND 메 시 지 를 전송 하 는 것 도 전체 프로그램의 핵심 처리 영역 이다.시스템 단추 가 꺼 졌 다 는 메 시 지 는 WM 입 니 다.CLOSE。창 초기 화 메시지 WMINITDIALOG 는 대화 상자 창 을 구축 하기 전에 보 내 는 초기 화 메시지 입 니 다.상기 각종 소식 에 응답 하기 위해 서 는 CMainWnd 에 이 몇 가지 소식 에 대한 응답 함 수 를 추가 해 야 하기 때문에 전체 CMainWnd 의 기본 적 인 실현 형식 은 다음 과 같다.
헤더 파일 설명:

/************************************************************************/
/* file  : CMainWnd.h 
 * author : Huagang Li
 * date  : 2014-8-30 15:29:42
 * blogs : http://www.cnblogs.com/lhglihuagang/
 * tips  :       ,          ,       
 */
/************************************************************************/
#ifndef _MAIN_WND_H
#define _MAIN_WND_H

#include <Windows.h>
//////////////////////////////////////////////////////////////////////////
// CMainWnd     ,  

class CMainWnd
{
public:
  static BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  static BOOL Main_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam);
  static void Main_OnCommand(HWND hWnd, int id, HWND hWndCtl, LPARAM lParam);
  static void Main_OnClose(HWND hWnd);

private:
  static HWND hMainWnd;  //      
};


#endif
CMainWnd 의 구체 적 인 정의:

#include "MainWnd.h"
include <WindowsX.h>
//////////////////////////////////////////////////////////////////////////
// static data members
HWND CMainWnd::hMainWnd = NULL;
//////////////////////////////////////////////////////////////////////////
// static function members
//         ,            
BOOL WINAPI CMainWnd::Main_Proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
 switch (uMsg)
 {
 HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
 HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
 HANDLE_MSG(hWnd, WM_CLOSE, Main_OnClose);
 }
</span><span style="color: #0000ff">return</span><span style="color: #000000"> FALSE;
}
BOOL CMainWnd::Main_OnInitDialog( HWND hWnd, HWND hWndFocus, LPARAM lParam )
{
 return TRUE;
}
// id      ID ,   resource         ID, “    ”    
//  ID_FILE_OPEN
void CMainWnd::Main_OnCommand( HWND hWnd, int id, HWND hWndCtl, LPARAM lParam )
{
 switch (id)
 {
 //
 }
}
void CMainWnd::Main_OnClose( HWND hWnd )
{
 ::EndDialog(hWnd, NULL);
}
CMainWnd 를 정의 한 후 main 함수 의 DialogBox 에 주 창의 프로 세 스 처리 함 수 를 추가 합 니 다.

::DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, CMainWnd::Main_Proc);
상기 절 차 를 실행 하면 시작 후의 메 인 인터페이스 가 창 에 있 는 시스템 단추 인'닫 기'에 응답 하 는 것 을 볼 수 있 습 니 다.그러나 메뉴 컨트롤 에 대한 메 시 지 는 함수 에서 아무것도 하지 않 았 기 때문에 아무런 처리 도 하지 않 습 니 다.
2.2 RichEdit 컨트롤 의 선택
      메모 장 프로그램 에 있어 서 메 인 인터페이스의 핵심 구역 은 편집 구역 입 니 다.그러나 현재 메모 장 프로그램 에 서 는 편집 컨트롤 을 선택 하지 않 았 습 니 다.기 존 windows 컨트롤 목록 을 살 펴 보면 편집 컨트롤 에 적합 한 Edit Control 과 Rich Edit 2.0 Control 이 있 음 을 알 수 있다.이 두 가지 편집 컨트롤 에 대해 Edit Control 은 비교적 간단 하지만 응답 하 는 기능 도 비교적 적다.Rich Edit 2.0 Control 은 실현 하기 가 비교적 복잡 하지만 대응 하 는 기능 도 많이 생 겼 다(예 를 들 어 글씨체 의 색깔,글자 번호 등 을 바 꿀 수 있다).본 고 는 기능 이 비교적 강 한 수첩 을 실현 하고 자 Rich Edit 2.0 Control 을 선택 하여 후속 개발 을 실시 했다.Rich Edit 2.0 Control 을 삽입 한 후 메 인 인터페이스 창 에 대응 하 는 자원 보 기 는 그림 2 참조:

그림 2 IDDMAIN 에 Rich Edit 2.0 Control 삽입
      상기 절차 가 실 행 된 후에 편집 인터페이스 가 있 는 메모 장 프로그램 을 볼 수 있 을 것 이 라 고 생각 했 지만 실제 프로그램 이 실 행 된 후에 아무런 효과 가 없 었 고 심지어 메 인 인터페이스 도 정상적으로 작 동 하지 못 했다.바 이 두 는 richedit 시작 에 실패 하 는 방법 은 모두 MFC 프로그램 에 대한 것 으로 초기 화 함수 Afx InitRichedit 2 를 추가 해 야 한 다 는 것 을 발견 했다.그러나 현재 windows API 를 사용 하여 개발 되 었 으 며,Afx InitRichEdit 2 라 는 함수 가 없어 서 다른 길 을 찾 을 수 밖 에 없다.마침내 박문 한 편 에서http://blog.csdn.net/dijkstar/article/details/7953816위 에 있 는 초기 화 함수 에서 주로 RichEdit 의존 dll 을 불 러 오 면 모든 문제 가 밝 아 집 니 다.주 창 이 시작 되 기 전에 이 dll 을 수 동 으로 불 러 오 면 됩 니 다.따라서 주 함수 의 DialogBox 앞 에 dll 을 불 러 오 는 동작 에 따라 다음 과 같이 추 가 했 습 니 다.

::LoadLibrary(T("riched20.dll"));
MAIN 의 properties 중:
이 때 프로그램 을 다시 실행 할 때 메모 장 을 정상적으로 시작 할 수 있 고 richedit 에서 편집 할 수 있 습 니 다.효 과 는 그림 3 참조.

그림 3 Riched 20.dll 을 수 동 으로 불 러 온 후 메 인 인터페이스 창 이 나타 납 니 다.
      메 인 화면 을 시작 하면 정상적으로 편집 할 수 있 습 니 다.이 컨트롤 은 정상적으로 작 동 할 수 있 을 것 같 습 니 다.그러나 실제 테스트 에서 다음 과 같은 몇 가지 문 제 를 발견 했다.
1.화면 이 실 행 된 후 RichEdit 테두리 모서리 가 너무 뚜렷 합 니 다.
    처리 방법:Richedit 컨트롤 의 properties  -> Boarder C> Flase
2.Enter 를 입력 하면 줄 을 바 꿀 수 없습니다(수 동 입력 시 같은 줄 에서 계속 편집)
   처리 방법:Richedit 컨트롤 의 properties  -> MultilineC> True
                      Richedit 컨트롤 의 properties  -> Want ReturnC> True
3.스크롤 바 없 음(가로 및 세로)
    이것 은 메 인 인터페이스 속성 에서 IDD
   처리 방법:IDDMAIN-> properties  -> Horizontal ScrollbarC> True
                      IDD_MAIN C> properties  -> Vertical ScrollbarC> True
4.창 크기 에 따라 신축 할 수 없습니다
    창 을 신축 할 때 RichEdit 컨트롤 의 크기 는 원래 크기 로 유지 합 니 다.그림 4 참조:

그림 4 메 인 인터페이스 크기 가 변 할 때 RichEdit 컨트롤 크기 가 변 하지 않 습 니 다.
    이 문 제 는 사실 이해 하기 쉽다.왜냐하면 메 인 인터페이스 창 을 신축 할 때 윈도 우즈 가 WM 를 보 내기 때문이다SIZE 메시지 알림 창 입 니 다.이 과정 은 windows 가 메 인 인터페이스 창 에"hi,당신 의 크기 가 변 했 습 니 다.변 경 된 크기 에 따라 변 경 됩 니 다"라 고 말 하 는 것 과 유사 합 니 다.현재 우리 의 주 창 프로 세 스 처리 함수 에는 WM 가 없습니다.SIZE 메 시 지 는 RichEdit 를 특수 처리 하기 때문에 메 인 화면 아래 의 RichEdit 는 자신의 원래 크기 를 유지 해 야 위의 상황 이 나타 날 수 있 습 니 다.그러면 구체 적 인 해결 방안 은 InitDialog 에 RichEdit 크기 적응 기능 을 추가 하 는 동시에 WMSIZE 메시지,Main 추가OnSize 함 수 는 이러한 독립 된 컨트롤 을 처리 합 니 다.구체 적 인 코드 는 다음 과 같다.

void CMainWnd::Main_OnSize( HWND hWnd, UINT state, int cx, int cy )
{
 RECT stRect;
 ::GetClientRect(hWnd, &stRect); //          
</span><span style="color: #008000">//</span><span style="color: #008000">  RichEdit          </span>
 ::MoveWindow(::GetDlgItem(hWnd, IDC_RICHEDIT), stRect.left, stRect.top,
 stRect.right-stRect.left, stRect.bottom-stRect.top, TRUE);
}
여 기 는 CMainWnd 에 WM 을 추 가 했 을 뿐 입 니 다.SIZE 메시지 응답 함수,RichEdit 에서 이 메시지 에 응답 하려 면 MainProc 에 해당 과정 추가

HANDLE_MSG(hWnd, WM_SIZE, Main_OnSize);
이렇게 하면 RichEdit 도 메 인 창의 크기 에 따라 자 유 롭 게 신축 할 수 있다.상기 프로 세 스 처리 함수 에서 주로 세 개의 기본 API 인 터 페 이 스 를 호출 하 였 다.
1.GetClient Rect,이 API 는 클 라 이언 트 크기 를 가 져 오 는 데 사 용 됩 니 다.RichEdit 신축 크기 가 바로 이 크기 입 니 다.
2.GetDlgItem 창 아래 컨트롤 의 핸들 가 져 오기,예 를 들 어 GetDlgItem(hwnd,IDCRICHEDIT)메 인 창 에서 RichEdit 컨트롤 에 대응 하 는 핸들 을 얻 을 수 있 습 니 다.
3. MoveWindow。첫 번 째 매개 변 수 는 위치 크기 변화 가 필요 한 창 핸들 입 니 다.2 의 RichEdit 핸들 을 입력 합 니 다.뒤의 매개 변 수 는 사각형 구역 의 left 점,top 점,width 값 과 height 값 입 니 다.마지막 매개 변 수 는 크기 가 바 뀐 후에 창 을 다시 그 릴 지 말 지 를 나타 내 는 데 사 용 됩 니 다.자,여기 TRUE 를 선 택 했 습 니 다.FALSE 를 선택 하면 다음 과 같은 상황 이 발생 합 니 다.창 을 작 게 만 든 후 크게 만 들 기 동작 을 할 때 RichEdit 는 커 진 영역 에 바로 적응 하지 못 하고 원래 작 아 지 는 영역 에 보관 합 니 다.효 과 는 그림 5 참조:

그림 5 MoveWindows 의 매개 변수 repaint 를 FALSE 로 설정 한 후 잠재 적 인 문제
이 를 바탕 으로 저 희 는 MoveWindow 로 창 을 크게 바 꾸 고 있 습 니 다.repaint 를 TRUE 로 하여 금 실시 간 으로 변 화 를 보장 하 는 것 이 좋 습 니 다.
2.3 메 인 프로그램 ICON 디자인
      위 캡 처 에서 보 듯 이 메 인 인터페이스의 왼쪽 상단 ICON 은 windows 자체 ICON 이 었 다.windows 자체 메모 장과 유사 하 게 하기 위해 인터넷 에서 비슷 한 JPG 아이콘 을 찾 아 ICO 로 전환 한 뒤 프로그램의 ICON 을 설정 했다.구체 적 인 아이콘 설정 방법 은 참고 하 시기 바 랍 니 다.http://www.cnblogs.com/lhglihuagang/p/3927283.html
      아이콘 설정 후 프로그램 을 실행 하여 최신 효 과 를 볼 수 있 습 니 다.그림 6 참조

그림 6 프로그램 아이콘 을 설정 한 결과
      마지막 으로 대화 상자 창의 제목 Dialog 는 좀 달라 보 입 니 다.windows 자체 메모 장 제목 인'제목 없 음-메모 장'에 따라 이 값 을 수정 하 였 습 니 다.구체 적 으로 는 IDD 입 니 다.MAIN-> properties  -> Caption C>제목 없 음-메모 장 마지막,대화 상자.
3.실행 결과
CMainWnd 와 RichEdit 를 추가 한 후 전체 프로그램의 실행 후 효 과 는 다음 그림 7 과 같 습 니 다.

그림 7 이 절 프로그램 이 바 뀐 후의 효과
4.결론
    1.RichEdit 컨트롤 을 사용 할 때 riched 20.dll 을 수 동 으로 불 러 와 야 합 니 다.그렇지 않 으 면 프로그램 이 실 행 된 후 인터페이스 효과 가 없습니다.
      2.RichEdit 줄 바 꾸 기,스크롤 바,테 두 리 는 properties 의 해당 필드 를 통 해 설정 할 수 있 습 니 다.
      3.CMainWnd 에 WM 를 추가 해 야 합 니 다.SIZE 메시지 응답 함수,RichEdit 자유 신축 보장.
5.링크 참조
      [1] http://blog.csdn.net/dijkstar/article/details/7953816
    [2] http://www.cnblogs.com/lhglihuagang/p/3927283.html
    [3] http://msdn.microsoft.com/en-us/library/ms633534(VS.85).aspx
6.설명
     이것 은 일련의 박문 이 될 것 이 며,그 후에 논리 적 기능 을 계속 보충 하 는 개발 절차 가 될 것 이다.더 많은 친구 들 과 교류 할 수 있 기 를 바 랍 니 다.이 글 이 괜 찮 은 것 같 으 면 좋아요,하하~~
      성명:설명 을 하지 않 으 면 본 고 는 떡 의 오리지널 입 니 다.      메모:전 재 는 전문 을 보존 해 야 합 니 다.수정 이 필요 하 시 면 작성 자 에 게 연락 하 십시오.

좋은 웹페이지 즐겨찾기