// Unicode文字セット
#include <Windows.h>
#include <stdio.h>
#define WIDTH(rect) ((rect).right - (rect).left)
#define HEIGHT(rect) ((rect).bottom - (rect).top)
#define CLASS_NAME TEXT("WinTest")
#define WINDOW_NAME TEXT("WinTest")
#define ADJUST_PIXEL 8
// 関数プロトタイプ宣言
void Trace(LPCTSTR format, ...);
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnMoving(LPARAM lParam);
void OnSize(WPARAM wParam, LPARAM lParam);
void OnGetMinMaxInfo(LPARAM lParam);
LRESULT OnCreate(LPARAM lParam);
// 外部変数構造体
static struct {
RECT rc;
} g;
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcx;
HWND hWnd;
MSG msg;
// ウィンドウクラスの登録
ZeroMemory(&wcx, sizeof wcx);
wcx.cbSize = sizeof wcx;
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = MainWndProc;
wcx.hInstance = hInstance;
wcx.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcx.lpszClassName = CLASS_NAME;
if (RegisterClassEx(&wcx) == 0) {
return 0;
}
// ウィンドウの作成
hWnd = CreateWindow(
CLASS_NAME, WINDOW_NAME,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
if (hWnd == NULL) {
return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// メッセージループ
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//------------------------------------------------------------------------------
void Trace(LPCTSTR format, ...)
{
va_list arg_ptr;
TCHAR buffer[256];
int size;
va_start(arg_ptr, format);
size = _vsnwprintf_s(buffer, _countof(buffer), _TRUNCATE, format, arg_ptr);
va_end(arg_ptr);
OutputDebugString(buffer);
if (size < 0) {
OutputDebugString(L"...\n");
}
}
//==============================================================================
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_MOVING:
OnMoving(lParam);
return TRUE;
case WM_SIZE:
OnSize(wParam, lParam);
return 0;
case WM_GETMINMAXINFO:
OnGetMinMaxInfo(lParam);
return 0;
case WM_CREATE:
return OnCreate(lParam);
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//------------------------------------------------------------------------------
void OnMoving(LPARAM lParam)
{
PRECT prc = (PRECT)lParam;
SHORT n;
n = GetKeyState(VK_CONTROL);
Trace(L"OnMoving(%d, %d, %d, %d) %d\n", prc->left, prc->top, prc->right, prc->bottom, n);
if ((n & 0x80) == 0) return;
if (abs(prc->left) <= ADJUST_PIXEL) {
prc->right = WIDTH(*prc);
prc->left = 0;
} else if (abs(prc->right - g.rc.right) <= ADJUST_PIXEL) {
prc->left = g.rc.right - WIDTH(*prc);
prc->right = g.rc.right;
}
if (abs(prc->top) <= ADJUST_PIXEL) {
prc->bottom = HEIGHT(*prc);
prc->top = 0;
} else if (abs(prc->bottom - g.rc.bottom) <= ADJUST_PIXEL) {
prc->top = g.rc.bottom - HEIGHT(*prc);
prc->bottom = g.rc.bottom;
}
}
//------------------------------------------------------------------------------
void OnSize(WPARAM wParam, LPARAM lParam)
{
POINTS pts = MAKEPOINTS(lParam);
Trace(L"OnSize(%u, %d, %d)\n", wParam, pts.x, pts.y);
}
//------------------------------------------------------------------------------
void OnGetMinMaxInfo(LPARAM lParam)
{
PMINMAXINFO pmmi = (PMINMAXINFO)lParam;
RECT rc;
Trace(L"OnGetMinMaxInfo(%d, %d)\n", pmmi->ptMinTrackSize.x, pmmi->ptMinTrackSize.y);
SetRect(&rc, 0, 0, 160, 120);
AdjustWindowRectEx(&rc, WS_OVERLAPPEDWINDOW, FALSE, 0);
pmmi->ptMinTrackSize.x = WIDTH(rc);
pmmi->ptMinTrackSize.y = HEIGHT(rc);
}
//------------------------------------------------------------------------------
LRESULT OnCreate(LPARAM lParam)
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
SystemParametersInfo(SPI_GETWORKAREA, 0, &g.rc, 0);
Trace(L"OnCreate %d, %d, %d, %d\n", g.rc.left, g.rc.top, g.rc.right, g.rc.bottom);
return 0;
}