본문 바로가기
C | C++ | VC++

투박한 윈도우즈7의 메뉴,툴바를 바꿔보자!

by 두루물 2010. 7. 27.

투박한 윈도우즈7의 메뉴,툴바를 바꿔보자! (플랫폼SDK 환경)
KFCWnd Library에 UI 메뉴 클래스 구성중..

윈도우7의 기본 common control 의 Menu ,Toolbar 컨트롤은 UI가 형편없다.
따라서,KFC 라이브러리에 이 메뉴,툴바 컨트롤 클래스를 추가 작업 진행...

kxMenu 클래스라 명명하고,KFC의 확장팩 개념으로 추가될 것이고,
완성되면 조만간,두루에디트에 붙일 예정이고

KFC 라이브러리는 kx 라이브러리로 재명명할 셈이다..


사용자 삽입 이미지

개발중인 화면 -- 날도 덥고 시간도 없고 잔손이 많이가고 귀찮으면 아무것도 못한다..ㅡㅡ;;


Owner Draw 메뉴의 원리는, CNSMenu (자작)라는 MFC 기반 메뉴구현 클래스에 이미 구현 하였듯이,
메뉴가 팝업될 때 WM_INITMENUPOPUP 이 메뉴가 보이기전에 먼저 호출되는데 이때 보여주려는 메뉴핸들을
기억하고 있다가 메뉴 창이 뜨는 시점에서 이를 후킹하여 창과 메뉴핸들의 정보를 맵핑하면서 프로시듀어를 가로챈다.
이 프로시듀어에서는 메뉴배경등을 WM_NCPAINT나 WM_PRINT에서 그려주면 되고,
메인 창에서는 WM_DRAWITEM에서 ODT_MENU 일때 각 메뉴 아이템을 그려주면 되고,
메뉴바와 팝업메뉴 사이에 경계선 영역을 그려주려면(위의 이미지의 적색부분) 이 메뉴핸들을 이용해,
kxMenu 클래스와 연관된 userdata 에 이미 셋팅한 부모메뉴 여부값에 따라 그려주거나 안그려야 할 상황을 판단한다.

문제는 MFC기반으로 된 클래스를 SDK 로 구현하는 것인데, KFC 클래스로 모두 마이그레이션 해야 한다.

/////////////////////////////////////////////////////////////////////////////
// CNSMenu the new menu class
// GuiLib도 그렇고 MCGUILib도 그렇고 CNSFrame를 사용하는게 낫다. 2010.07.26
// MCGUILib는 GuiLib를 고쳐보려고 본인이 NewMenu 원 버전을 접목했으나,
// CMC~~ ,CNS~~ 로 구분했다.GuiLib쪽 로직이 부실하므로 CNS~ 계열을 사용할것을 권함.
/*
 작동절차: 메인윈도우 처음에 메인메뉴를 읽어들여,popup메뉴와 parent 메뉴를
 등록한다. 메뉴핸들은 mfc 내부의 리스트에 핸들과 클래스포인터가 추가된다.
 system 메뉴도 CNSMenu 형태로 로드한다.
 메인 윈도우에서 WM_INITMENU나 WM_INITMENUPOPUP가 호출되면 현재 생성될 창이
 그릴 메뉴핸들에 속하는 CNSMenuHook::m_hLastMenu = pPopupMenu->m_hMenu;를 등록하고,
 메인메뉴바를 다시 그리도록 한다.
 또,팝업메뉴 되면서 메뉴창이 WM_CREATE되면 후킹루틴에서 이 CNSMenuHook::m_hLastMenu
 을 가지고 후킹윈도우의 메뉴로 지정하고 WM_PRINT나 WM_NCPAINT에서 메뉴배경이나 메뉴바와
 팝업메뉴사이의 경계선을 그리도록 한다.
 이때 parent 메뉴가 없는 것으로 메뉴메뉴팝업이냐,시스템이나팝업메뉴냐를 구분하여
 경계선 그리기여부를 결정한다.
 메인메뉴의 팝업들은 CNSMenu::LoadMenu 에서 모두 parent메뉴가 셋팅된다.
 단순 CNSMenu 생성자는 parent메뉴가 없다.

 SDK로 옮길경우 주요 쟁점은,
 즉,
 1)구분해야 할것은,내가 그려야 할 팝업메뉴가 부모메뉴가 있는지 판별하여 경계선 유무결정,
 2)내가 지금 후킹하는 창이 어떤 메뉴핸들인지로 메뉴정보를 얻을수 있도록 함.

*/

*KFC는 플랫폼 SDK 환경에서 C++클래스 기반으로 프로그래밍 가능한 개발 플랫폼 라이브러리 입니다.

KFC로 스플래시 화면 구현 예제:

KFC 라이브러리를 어떻게 쓰는지 방식을 볼수 있는 샘플 소스 입니다.MFC나 WTL과 아주 흡사합니다.