「C言語/C++/WinTest」の編集履歴(バックアップ)一覧に戻る

C言語/C++/WinTest - (2012/10/23 (火) 18:45:32) のソース

|開発環境|Microsoft Visual C++ 2010 Express (SP1)|
|実行環境|Microsoft Windows XP Home Edition (SP3)|
|プロジェクトの種類|Win32 プロジェクト|
|プロジェクト名|WinTest|
|アプリケーションの種類|Windows アプリケーション|
|追加のオプション|空のプロジェクト|
|文字セット|Unicode|

-最小ウィンドウサイズの指定
-ウィンドウ移動時にCtrlキーを押した時だけ画面端に吸着

参考
-[[メインウィンドウの最小サイズを指定する>http://www.rakuchinn.jp/programming/mfc_0016.html]]

WinTest.c
#highlight(c){{
// 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;
}
}}