🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3068閲覧

WINAPIで一部のTextOutがなぜか表示されない

tettyA

総合スコア93

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/12 07:45

編集2020/12/12 07:52

しっかり、.\log.txtには正しくファイル・フォルダ名が書き込まれているのに、
なぜかforの中のTextOut()だけがしっかりと表示してくれません。
なぜでしょうか。また、その解決策を教えてください。
ちなみに、ウィンドウのサイズを変更すると、しっかりとforの中のTextOut()も働いてくれます。

forの中だけTextOutされない。↓
![イメージ説明]

C++

1// coolexplorer.cpp : アプリケーションのエントリ ポイントを定義します。 2// 3 4#include "framework.h" 5#include "coolexplorer.h" 6#include <filesystem> 7#include <string> 8#include <vector> 9#define MAX_LOADSTRING 100 10 11// グローバル変数: 12HINSTANCE hInst; // 現在のインターフェイス 13WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト 14WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 15HWND hWnd; 16std::string nowPath = R"(C:)"; //現在のパス 17std::vector<std::filesystem::directory_entry> nowDirectory; //現在のディレクトリのファイル、フォルダ群 18 19// このコード モジュールに含まれる関数の宣言を転送します: 20ATOM MyRegisterClass(HINSTANCE hInstance); 21BOOL InitInstance(HINSTANCE, int); 22LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 23INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 24 25int APIENTRY wWinMain(_In_ HINSTANCE hInstance, 26 _In_opt_ HINSTANCE hPrevInstance, 27 _In_ LPWSTR lpCmdLine, 28 _In_ int nCmdShow) 29{ 30 ... 31 32 nowDirectory.clear(); 33 for (std::filesystem::directory_entry f : std::filesystem::directory_iterator(nowPath)) {//最初のC:\を取得 34 nowDirectory.push_back(f); 35 } 36 37 SendMessage(hWnd, WM_PAINT, 0, 0); //これで中身の入ったnowDirectoryでWM_PAINTする。 38 // メイン メッセージ ループ: 39 while (GetMessage(&msg, nullptr, 0, 0)) 40 { 41 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 42 { 43 TranslateMessage(&msg); 44 DispatchMessage(&msg); 45 } 46 } 47 48 return (int) msg.wParam; 49} 50 51 52 53// 54// 関数: MyRegisterClass() 55// 56// 目的: ウィンドウ クラスを登録します。 57// 58ATOM MyRegisterClass(HINSTANCE hInstance) 59{ 60 ... 61} 62 63// 64// 関数: InitInstance(HINSTANCE, int) 65// 66// 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します 67// 68// コメント: 69// 70// この関数で、グローバル変数でインスタンス ハンドルを保存し、 71// メイン プログラム ウィンドウを作成および表示します。 72// 73BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 74{ 75 ... 76} 77 78// 79// 関数: WndProc(HWND, UINT, WPARAM, LPARAM) 80// 81// 目的: メイン ウィンドウのメッセージを処理します。 82// 83// WM_COMMAND - アプリケーション メニューの処理 84// WM_PAINT - メイン ウィンドウを描画する 85// WM_DESTROY - 中止メッセージを表示して戻る 86// 87// 88LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 89{ 90 switch (message) 91 { 92 case WM_COMMAND: 93 { 94 ... 95 } 96 break; 97 case WM_PAINT: 98 { 99 PAINTSTRUCT ps; 100 HDC hdc = BeginPaint(hWnd, &ps); 101 FILE* fp; 102 fopen_s(&fp, ".\log.txt", "w"); 103 104 // TODO: HDC を使用する描画コードをここに追加してください... 105 SetTextColor(hdc, RGB(255, 255, 255)); 106 SetBkColor(hdc, RGB(0, 0, 0)); 107 108 TextOut(hdc, 0, 0, std::filesystem::absolute(nowPath).c_str(), lstrlen(std::filesystem::absolute(nowPath).c_str())); 109 for (int i = 0; i < nowDirectory.size(); i++) { 110 TextOut(hdc, 30, (i * 15) + 20, 111 (TEXT("├─") + nowDirectory[i].path().wstring()).c_str(), 112 lstrlen((TEXT("├─") + nowDirectory[i].path().wstring()).c_str())); 113 114 fputs((nowDirectory[i].path().string() + "\n").c_str(), fp); 115 } 116 TextOut(hdc, 0, 200, TEXT("TEST"), lstrlen(TEXT("TEST"))); 117 fclose(fp); 118 EndPaint(hWnd, &ps); 119 } 120 break; 121 case WM_DESTROY: 122 PostQuitMessage(0); 123 break; 124 default: 125 return DefWindowProc(hWnd, message, wParam, lParam); 126 } 127 return 0; 128} 129 130INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 131{ 132 ... 133} 134

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

描画イベントを発生させるには、WM_PAINTメッセージを送信するのではなくて、InvalidateRectを呼び出してください。
InvalidateRectの呼び出しで、WM_PAINTメッセージが送信されます。

投稿2020/12/12 09:06

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tettyA

2020/12/12 09:30

ありがとうございます! 無事、描画することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問