「C言語/C++/WinTest」の編集履歴(バックアップ)一覧はこちら

C言語/C++/WinTest - (2012/10/23 (火) 18:45:32) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

|開発環境|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; LONG lWidth, lHeight; 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; lWidth = prc->right - prc->left; if (abs(prc->left) <= ADJUST_PIXEL) { prc->left = 0; prc->right = lWidth; } else if (abs(prc->right - g.rc.right) <= ADJUST_PIXEL) { prc->right = g.rc.right; prc->left = (prc->right - lWidth); } lHeight = prc->bottom - prc->top; if (abs(prc->top) <= ADJUST_PIXEL) { prc->top = 0; prc->bottom = lHeight; } else if (abs(prc->bottom - g.rc.bottom) <= ADJUST_PIXEL) { prc->bottom = g.rc.bottom; prc->top = (prc->bottom - lHeight); } } //------------------------------------------------------------------------------ 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; } }}
|開発環境|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; } }}

表示オプション

横に並べて表示:
変化行の前後のみ表示: