実現したいこと
ウィンドウサイズの高さをマウスで小さく変更したときに文字1行分の高さより小さくできないようにしたい
発生している問題・分からないこと
数年前に試したとき(windows7の時だったかもしれない)は以下のソースコードでうまくいったはずなのですがなぜか文字が半分ぐらい隠れるようになっていました。
私の考えではタイトルバーの高さ、枠の高さ、文字の高さのどれかの情報が実際より少なく取得されているのではないかと思うのですが・・・。どうすれば改善できますか?
該当のソースコード
C
1#include <windows.h> 2 3LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 4 5TCHAR szClassName[] = TEXT("myprog"); 6 7 8int WINAPI WinMain(_In_ HINSTANCE hCurInst, _In_opt_ HINSTANCE hPrevInst, 9 _In_ LPSTR lpsCmdLine, _In_ int nCmdShow) 10{ 11 MSG msg; 12 BOOL bRet; 13 WNDCLASSEX wc; 14 HWND hWnd; 15 ATOM atom; 16 17 18 19 wc.cbSize = sizeof(WNDCLASSEX); 20 wc.style = CS_HREDRAW | CS_VREDRAW; 21 wc.lpfnWndProc = WndProc; 22 wc.cbClsExtra = 0; 23 wc.cbWndExtra = 0; 24 wc.hInstance = hCurInst; 25 wc.hIcon = (HICON)LoadImage(NULL, 26 MAKEINTRESOURCE(IDI_APPLICATION), 27 IMAGE_ICON, 28 0, 29 0, 30 LR_DEFAULTSIZE | LR_SHARED); 31 wc.hCursor = (HCURSOR)LoadImage(NULL, 32 MAKEINTRESOURCE(IDC_ARROW), 33 IMAGE_CURSOR, 34 0, 35 0, 36 LR_DEFAULTSIZE | LR_SHARED); 37 wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 38 wc.lpszMenuName = NULL; 39 wc.lpszClassName = szClassName; 40 wc.hIconSm = (HICON)LoadImage(NULL, 41 MAKEINTRESOURCE(IDI_APPLICATION), 42 IMAGE_ICON, 43 0, 44 0, 45 LR_DEFAULTSIZE | LR_SHARED); 46 47 if ((atom = RegisterClassEx(&wc)) == 0) 48 return FALSE; 49 50 hWnd = CreateWindow(MAKEINTATOM(atom), 51 TEXT("ウィンドウサイズ制限のテスト"), 52 WS_OVERLAPPEDWINDOW, 53 CW_USEDEFAULT, 54 CW_USEDEFAULT, 55 CW_USEDEFAULT, 56 CW_USEDEFAULT, 57 NULL, 58 NULL, 59 hCurInst, 60 NULL); 61 if (!hWnd) 62 return FALSE; 63 64 ShowWindow(hWnd, nCmdShow); 65 UpdateWindow(hWnd); 66 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { 67 if (bRet == -1) { 68 break; 69 } else { 70 TranslateMessage(&msg); 71 DispatchMessage(&msg); 72 } 73 } 74 return (int)msg.wParam; 75} 76 77//ウィンドウプロシージャ 78 79LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 80{ 81 HDC hdc; 82 PAINTSTRUCT ps; 83 static int cyChar; 84 static TCHAR szMoji[256]=TEXT("ウィンドウサイズの高さを小さくしてもこの文字列が隠れないようにする"); 85 TEXTMETRIC tm; 86 LPMINMAXINFO lpmm; 87 switch (msg) { 88 case WM_CREATE: 89 hdc = GetDC(hWnd); 90 GetTextMetrics(hdc, &tm); 91 cyChar = tm.tmHeight + tm.tmExternalLeading; 92 ReleaseDC(hWnd,hdc); 93 break; 94 case WM_GETMINMAXINFO: 95 lpmm = (LPMINMAXINFO)lp; 96 lpmm->ptMinTrackSize.y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME) * 2 + cyChar; 97 return 0; 98 case WM_PAINT: 99 hdc = BeginPaint(hWnd, &ps); 100 TextOut(hdc, 0, 0, szMoji,lstrlen(szMoji)); 101 102 103 EndPaint(hWnd, &ps); 104 break; 105 case WM_DESTROY: 106 PostQuitMessage(0); 107 break; 108 default: 109 return (DefWindowProc(hWnd, msg, wp, lp)); 110 } 111 return 0; 112}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
GetSystemMetrics関数などの情報を調べなおしたが原因がよくわからなかったです。
補足
Microsoft Visual Studio Community 2019
Microsoft Visual C++ 2019 C言語
WIN32 ユニコードビルド Windows10
回答1件
あなたの回答
tips
プレビュー