![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_03.png?5a7ff87)
ウィンドウの右クリックで、
ファイル名を読み込み、ウィンドウ上に表示させたいのですが、
うまくいかないです。どうしてでしょう。
ちなみに、タイトルバーには、表示されます。
宜しくお願い致します。
case WM_RBUTTONUP:
if ( ofn.lStructSize == 0 ){
ofn.lStructSize = sizeof( OPENFILENAME );
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text files {*.txt}\0*.txt\0")
TEXT("HTML files {*.htm}\0*.htm;*.html\0")
TEXT("All files {*.*}\0*.*\0\0");
ofn.lpstrCustomFilter = strCustom;
ofn.nMaxCustFilter = sizeof( strCustom );
ofn.nFilterIndex = 0;
ofn.lpstrFile = strFile;
ofn.nMaxFile = sizeof( strFile );
ofn.Flags = OFN_FILEMUSTEXIST;
}
if ( GetOpenFileName(&ofn) ){
SelectObject( hdc, hFont );
SetBkColor( hdc, RGB(255,255,255) );
TextOut( hdc, 200, 410, strFile, lstrlen(strFile) );
SetWindowText( hWnd, strFile );
}
else{
MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK );
}
return 0;
No.3ベストアンサー
- 回答日時:
>修正しても駄目でした・・・^^;
>すいません、できましたー!
えっと。。。どっちだろう。。。?
一応タイトルとウィンドウに表示するサンプル貼っとこう。。。
(空白全角)
#Oh-Orangeさんがおっしゃっていることをそのままな感じデスガ
/*
* OpenFile Dialog Sample
* Windows XP Pro / VC++6.0
*/
#include<windows.h>
#define ALL_FILTER TEXT("All File {*.*}\0*.*\0")
#define TXT_FILTER TEXT("Text File {*.txt}\0*.txt\0")
#define FILE_FILTER (TXT_FILTER ALL_FILTER)
OPENFILENAME ofn = {0};
BOOL InitFileDialog( HWND hWnd );
BOOL GetOpenFilePath( CHAR* Path, INT cbSize );
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp);
INT WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance ,LPSTR lpCmdLine , int nCmdShow )
{
MSG msg;
HWND hWnd;
char* Class = "HOGE";
char* Titel = "HOGE";
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = NULL;
winc.hCursor = NULL;
winc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = Class;
if( !RegisterClass( &winc )){
MessageBox( NULL, "アプリ登録失敗", NULL, MB_OK );
return 1;
}
hWnd = CreateWindowEx( WS_EX_TOPMOST, Class, Titel, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );
if( !hWnd )
{
MessageBox( NULL, "ウィンドウ作成失敗", NULL, MB_OK );
return 2;
}
ShowWindow( hWnd, SW_SHOW );
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
static HFONT hFont = NULL;
static HDC hDC = NULL;
static CHAR FullPath[256] = {0};
switch (uMsg) {
case WM_CREATE:
hFont = CreateFont( 20, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE,
SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,
FIXED_PITCH | FF_MODERN, "MS ゴシック" );
if ( hFont == NULL )
{
MessageBox( hWnd, "フォントオブジェクトの生成に失敗", NULL, MB_OK );
PostQuitMessage(0);
}
hDC = GetDC( hWnd );
if(InitFileDialog(hWnd)==FALSE)
{
MessageBox( hWnd, "ファイルダイアログの初期化失敗", NULL, MB_OK );
CloseHandle( hFont );
PostQuitMessage(0);
}
break;
case WM_RBUTTONUP:
memset( FullPath, '\0', sizeof(FullPath));
GetOpenFilePath( FullPath, sizeof(FullPath) );
SetWindowText( hWnd, FullPath );
//読み込んだパスをWINDOW上に表示
TextOut( hDC, 20, 200, FullPath, lstrlen(FullPath));
//ダイアログで文字が欠けるので無効領域をクライアント領域に発生させる
InvalidateRect( hWnd, NULL, TRUE );
break;
case WM_PAINT:
//無効領域が発生した場合の再描画
HDC hPaint;
PAINTSTRUCT ps;
hPaint = BeginPaint(hWnd , &ps);
TextOut( hPaint , 20 , 200 , FullPath , lstrlen(FullPath));
EndPaint(hWnd , &ps);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
CloseHandle( hFont );
ReleaseDC( hWnd, hDC );
PostQuitMessage(0);
break;
default:
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
//何か処理をしたら0を返却する
return 0L;
}
BOOL InitFileDialog( HWND hWnd )
{
CHAR strFile[MAX_PATH];
if( hWnd==NULL ){
return FALSE;
}
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = FILE_FILTER;
ofn.lpstrFile = strFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
return TRUE;
}
BOOL GetOpenFilePath( CHAR* Path, INT cbSize )
{
GetOpenFileName(&ofn);
if( cbSize < (lstrlen(ofn.lpstrFile)+1)){
return FALSE;
}
lstrcpy( Path, ofn.lpstrFile );
return TRUE;
}
実は、WM_RBUTTONUPで描画しなくても、再描画してるから
無効領域を発生させるだけで描画できたりとか・・・:-P
この回答への補足
すいません、できております。
コンパイルしたのですが、
ファイルを選択したものの、何もウィンドウに表示されない。
そこで、タイトルバーをクリックしてウィンドウを広げた
ところ、思い通りの結果がウィンドウ上に表示されました。
原因は何かを調べているところです。
また、ファイルを一回選択し、タイトルバーを広げると思い通りの結果が表示されるのですが、もう一度ファイルを開くと、その結果につけたした結果が出てしまうのです。カウンターが初期化されてないのでしょうかね。。
/* ---------------------表示部分 ---------------------------------- */
#define TITLE TEXT("CL(15:0)")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
HDC hDC;
HPEN hpen;
PAINTSTRUCT ps;
HFONT hFont;
HWND hwnd;
int i;
int j ;
int k = 1;
int l;
int m=0;
static TCHAR str[64];
static TCHAR strtwo[640];
static TCHAR strFile[MAX_PATH];
int modulecounter; /* "module"の数 */
int countertwo;
int inputcounter; /* inputの数 */
int outputcounter;/* outputの数 */
FILE *fp;
/* module名をとってくる */
char *y = modulename(m,strFile);
/* module名をとってくる */
char word[100];
char finger;
PAINTSTRUCT paint;
static OPENFILENAME ofn = {0};
static TCHAR strCustom[256] = TEXT("Before files\0*.*\0\0");
modulecounter = ShowResult(); /* moduleの数を探してこい */
countertwo = ShowResultThree(); /* ";"の数を探して来い */
inputcounter = ShowResultTwo();
outputcounter = ShowResultFour();
switch (msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
/* ウィンドウからファイルオープンダイアグラム */
case WM_CREATE:
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = TEXT("Text files {*.v}\0*.v\0")
TEXT("HTML files {*.htm}\0*.htm;*.html\0")
TEXT("All files {*.*}\0*.*\0\0");
ofn.lpstrCustomFilter = strCustom;
ofn.nMaxCustFilter = 256;
ofn.nFilterIndex = 0;
ofn.lpstrFile = strFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
return 0;
case WM_RBUTTONUP:
hdc = GetDC( hWnd );
if ( GetOpenFileName(&ofn) ){
if ((fp = fopen(strFile, "r")) == NULL) { /* 読み込むファイル名 */ /* ファイルを開けなかったら */
/*fprintf(stderr, "Can't Open C Source File!\n"); メッセージを表示して */
exit(2);/* シェルへ戻る */
}
/* 英単語が見つかったら予約語かどうか調べる */
while (GetWord(fp, word)) {
BSearch(word);
}
SelectObject( hdc, hFont );
SetBkColor( hdc, RGB(255,255,255) );
TextOut( hdc, 200, 410, strFile, lstrlen(strFile) );
SetWindowText( hWnd, strFile );
}else{
MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK );
}
ReleaseDC( hWnd, hdc );
fclose(fp);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
hFont = CreateFont(
15 , 0 , 0 , 0 , FW_THIN , 0 , 0 , FALSE ,
SHIFTJIS_CHARSET , OUT_DEFAULT_PRECIS ,
CLIP_DEFAULT_PRECIS , DEFAULT_QUALITY ,
VARIABLE_PITCH | FF_ROMAN , NULL
); /* フォント TRUE = 1 , FALSE = 0 */
hpen = CreatePen(PS_DASH , 0 , RGB(100 , 0 , 50)); /* 線の形・線の色・ペンの色 */
SelectObject(hdc , hpen);
MoveToEx(hdc , 50 , 50 , NULL);/* 線のカレントポジション */
LineTo(hdc , 100 , 50); /* 左上X座標左上Y座標右下X座標右下Y座標 */ /* 円は、Ellipse(hdc , 30 , 30 , 180 , 180); */
No.4
- 回答日時:
>そこで、タイトルバーをクリックしてウィンドウを広げた
>ところ、思い通りの結果がウィンドウ上に表示されました。
>原因は何かを調べているところです。
>また、ファイルを一回選択し、タイトルバーを広げると思い通りの
>結果が表示されるのですが、もう一度ファイルを開くと、その結果に
>つけたした結果が出てしまうのです。カウンターが初期化されてないのでしょうかね。。
この現象は恐らく、ウィンドウサイズが変更されたことによって
発行される WM_PAINT のおかげです。WM_RBUTTONUPの中で描画処理を
行っていない為、 WM_PAINT が送られるまで何も表示されなかったり、
前回のものがそのまま表示されていたりする為だと思われます。
No.2
- 回答日時:
★あらら別質問を立てちゃいましたね。
・こちらにも一部を貼り付けておきます。
>hdc、hFont には正しくハンドルが入っていますか?確認して下さい。
↑
hdc のハンドルに BeginPaint() 関数を使っていますが間違いです。
この BeginPaint() 関数は WM_PAINT メッセージ内でしか使うことがない関数です。
同様に EndPaint() 関数も同じく WM_PAINT メッセージ内でしか使いません。
ここが面白い(おかしい)ところですが WM_PAINT メッセージ以外でクライアント領域などに
描画したい場合は GetDC()、RealeceDC() 関数を使います。
下にサンプルを載せます。
サンプル1:
WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint( hWnd, &ps );
// ここで図形や文字を hDC に描画
EndPaint( hWnd, &ps );
break;
}
サンプル2:
WM_RBUTTONUP:
{
HDC hDC;
hDC = GetDC( hWnd );
// ここで図形や文字を hDC に描画
ReleaseDC( hWnd, hDC );
break;
}
解説:
・WM_PAINT メッセージ内では BeginPaint、EndPaint 関数を使います。
でも WM_PAINT メッセージ以外では GetDC、ReleaseDC 関数を使います。
GetDC 関数でデバイスコンテキストを取得して
ReleaseDC 関数でデバイスコンテキストを解放します。
・今回の場合は WM_CREATE メッセージで『hDC = GetDC( hWnd );』を記述して
WM_CLOSE メッセージか、WM_DESTORY メッセージのどちらか一方に
『ReleaseDC( hWnd, hDC );』を記述します。
改善策:
・次のように修正して下さい。
修正前⇒『hdc = BeginPaint(hWnd , &ps);』
修正後⇒『hdc = GetDC( hWnd );』
・あと次の部分も一緒に修正して下さい。
修正前⇒『EndPaint( hWnd, &ps );』
修正後⇒『ReleaseDC( hWnd, hdc );』
・以上。
参考URL:http://oshiete1.goo.ne.jp/qa3364459.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パレット番号で塗りつぶし
-
ダイアログにビットマップを貼...
-
開発環境:visual c++ 2008 ...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
VBAのフォント変更(エクセルか...
-
ガウシアンフィルタのCプログラム
-
チェックボックスの箱のサイズ...
-
FlexGridの一部のみ表示を更新...
-
フォームでPDFを表示させた...
-
検索の画面がでなくなってしま...
-
コンボボックスのリストに水平...
-
[VB.net] DataGridViewの列ヘッ...
-
他のウィンドウのボタンを自動...
-
VB6のPrinter.ScaleWidth に対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画像処理 ビットマップ ダブ...
-
画面がチカチカする
-
BeginPaintの使い方
-
VC++のTextOutの再描画の仕方
-
BitBlt関数について教えてください
-
GetDC()とCreateCompatibleDC()
-
VBでFD、USBの有効・無効...
-
領域を塗りつぶしたい
-
ダブルバッファの作り方
-
ダイアログにビットマップを貼...
-
Rectangleで、リソースが解放さ...
-
GetPixelに使うHDCの作り方
-
デバイスコンテキストに関して2...
-
メモリデバイスコンテキストを...
-
画面のちらつきについて
-
WinAPIでスクリーン画像を映し...
-
VC++でBitmapとText文字を表示...
-
SetWindowRgn()関数について。
-
丸いボタンの表示でCPU100%
おすすめ情報