WIN 32 API를 이용해서 분할윈도우를 만들고자 2일에 걸쳐서 인터넷를 뒤졌죠..
그러다가 어떤님 블로그에서 비슷한 예제를 발견했네요. 하지만; 실행이 안되더군요..ㅠ_ㅠ
그래도 그걸 참고삼아서 이러저리 짜집기를 해놓았드니 돌아가드라구요.. 넘 어렵게 찾아서 팁으로 올려봅니다.
아무쪼록 도움이 되는 분들이 있기를^^ 시작합니다.
===================================================================================================================
저는 VC2005를 사용합니다. 그걸 위주로 설명할께요.
먼저 프로젝트를 생성합니다. WIN32 Project의 Windows Application 스타일로 만들면 됩니다.
프로젝트가 생성이 되면 기본적인 stdafx파일과 메인윈도우가 자동으로 생성이 됩니다.^^
그러면 만들어진 자동생성 코드에 보면
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
<----브러쉬 관련 코드 넣기----->
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST2));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST2);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
<----분할 윈도우 관련 코드 넣기----->
return RegisterClassEx(&wcex);
}
클래스가 있습니다. 위와 같은 형태입니다. 위의 클래스에 분할될 윈도우에 관한 설정을 추가해 줘야 합니다.
위의 코드에서 <브러쉬 관련 코드넣기 >부분에 아래 코드를 추가합니다. 분할된 윈도우에 색을 넣어주기 위해서 입니다. 그래야 눈에 잘 띄어서 제대로 들어갓는지 확인하기가 편하거든요.
static HBRUSH hRedBrush, hBlueBrush, hGreenBrush;
hRedBrush=CreateSolidBrush(RGB(255,0,0));
hGreenBrush=CreateSolidBrush(RGB(0,255,0));
hBlueBrush=CreateSolidBrush(RGB(0,0,255));
다음으로 아래의 <분할 윈도우 관련 코드 넣기> 부분에 아래 코드를 삽입합니다.
hbrBcakground 는 윈도우에 색을 넣는 부분입니다. 빨랑, 초록, 파랑 순으로 넣을겁니다.
lpfnWndProc 는 윈도우 프로시저를 링크합니다. 메시지들을 받기 위해서죠.
lpszClassName 는 클래스의 이름을 넣는 부분입니다.
wcex.hbrBackground = hRedBrush;
wcex.lpfnWndProc = ChildLeftProc;
wcex.lpszClassName = "ChildLeft";
RegisterClassEx(&wcex);
wcex.hbrBackground = hGreenBrush;
wcex.lpfnWndProc = ChildTopProc;
wcex.lpszClassName = "ChildTop";
RegisterClassEx(&wcex);
wcex.hbrBackground = hBlueBrush;
wcex.lpfnWndProc = ChildBottomProc;
wcex.lpszClassName = "ChildBottom";
자 그럼 MyRegisterClass() 함수에 관해서는 끝났습니다.
다음으로 위에 ChildLeftProc, ChildTopProc, ChildBottomPorc 클래스가 없습니다. 이부분은
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
클래스를 복사하셔서 적당하게 만드시기 바랍니다. 위에 선언해 주시는 것도 잊지 마시고요.
그럼 이제 윈도우 생성함수를 만들어야 됩니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
이 프로시저 함수 안에 만들겁니다.
case WM_CREATE:
hC1 = CreateWindow("ChildLeft", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
hC2 = CreateWindow("ChildTop", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
hC3 = CreateWindow("ChildBottom", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
break;
switch문 안에 위의 코드를 삽입합니다. 윈도우를 생성하는 함수입니다. 3개의 윈도우로 나눌것이기 때문에 3개를 만들었습니다. 주의할 점은 먼 처음 인자에 "ChildLeft"부분을 위에서 클래스이름과 동일하게 해야 된다는 점입니다.
다음으로 3개의 윈도우의 위치를 설정합니다. MoveWindow()를 사용합니다. 코드는 아래와 같습니다.
case WM_SIZE:
if(wParam != SIZE_MINIMIZED)
{
GetClientRect(hWnd, &rect);
MoveWindow(hC1, 0, 0, 300, 300, TRUE);
MoveWindow(hC2, 300, 0, rect.right-300, 300, TRUE);
MoveWindow(hC3, 0, 300, rect.right, rect.bottom, TRUE);
}
break;
실행하면 아래와 같이 됩니다.

// TEST2.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "TEST2.h"
#define MAX_LOADSTRING 100
//윈도우 핸들 추가
HWND hC1, hC2, hC3;
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
//윈도우 프로시저 추가
LRESULT CALLBACK ChildLeftProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildTopProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildBottomProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TEST2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST2));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
//브러시 추가
static HBRUSH hRedBrush,hBlueBrush,hGreenBrush;
hRedBrush=CreateSolidBrush(RGB(255,0,0));
hGreenBrush=CreateSolidBrush(RGB(0,255,0));
hBlueBrush=CreateSolidBrush(RGB(0,0,255));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST2));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST2);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassEx(&wcex);
//윈도우 클래스 설정
wcex.hbrBackground = hRedBrush;
wcex.lpfnWndProc = ChildLeftProc;
wcex.lpszClassName = "ChildLeft";
RegisterClassEx(&wcex);
wcex.hbrBackground = hGreenBrush;
wcex.lpfnWndProc = ChildTopProc;
wcex.lpszClassName = "ChildTop";
RegisterClassEx(&wcex);
wcex.hbrBackground = hBlueBrush;
wcex.lpfnWndProc = ChildBottomProc;
wcex.lpszClassName = "ChildBottom";
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
//윈도우 생성
hC1 = CreateWindow("ChildLeft", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
hC2 = CreateWindow("ChildTop", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
hC3 = CreateWindow("ChildBottom", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, 0, hInst, NULL);
break;
case WM_SIZE:
//윈도우 위치, 사이즈 조정
if(wParam != SIZE_MINIMIZED)
{
GetClientRect(hWnd, &rect);
MoveWindow(hC1, 0, 0, 300, 300, TRUE);
MoveWindow(hC2, 300, 0, rect.right-300, 300, TRUE);
MoveWindow(hC3, 0, 300, rect.right, rect.bottom, TRUE);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
LRESULT CALLBACK ChildLeftProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK ChildTopProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK ChildBottomProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
[출처] [WIN32 API ] 분할 윈도우 만들기|작성자 아즈라엘






Recent Comment