- ベストアンサー
1つのウィンドウに2つのエディット
case WM_CREATE: GetClientRect(hWnd, &rc); EditL = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , 0 , 0 , rc.right / 2 , rc.bottom , hWnd , (HMENU)1 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL); EditR = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL); return FALSE; とすると、1つのエディットしか表示されません。 また、 case WM_SIZE: GetClientRect(edit, &rc); MoveWindow(edit, rc.left, rc.top, rc.right, rc.bottom, TRUE); として、ウィンドウサイズが変更された時に どちらのエディットもクライアント領域にあわせたつもりなのですが、 サイズ変更で左側のエディットがスクロールバーの幅の分だけ 縮小されてしまいます。 どこをどのように直したらよろしいのでしょうか? 宜しくお願いします。 #Win98 & VC++6.0 & SDK で作成しています。
- rewind
- お礼率97% (42/43)
- C・C++・C#
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CreateWindow()、MoveWindow()とも右側のEditを操作するときに幅の指定が間違っていますね。 サイズと位置の指定は、左上の座標と、ウィンドウの幅と高さを指定する必要があります。 しかし、rewindさんのソースは両方ともrc.rightを指定しています。これでは、親ウィンドウのクライアント領域と同じ幅のエディットとなってしまい、垂直スクロールバーは見えなくなってしまいます。 なので幅を指定する際に、rc.right/2としましょう。 あとアドバイス。 VC++に付属しているSpy++というツールを使ってみましょう。 今回のようなことはすぐに原因が見つけられるはずです。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>case WM_SIZE: > GetClientRect(edit, &rc); >MoveWindow(edit, rc.left, rc.top, >rc.right, rc.bottom, TRUE); GetClientRect()でEditのウィンドウハンドルを渡していませんか? 親ウィンドウのクライアント領域の矩形を取得して、それに合わせてエディットボックスを移動させる必要があります。 #wParam、lParamにクライアント領域のサイズが格納されているのでわざわざ取得する必要もないですけど。
お礼
返答おそくなりまして、すみません。 少し進展しました。 ご指摘を受けて下記の様に修正。 case WM_SIZE: GetClientRect(hWnd, &rc); MoveWindow(EditL, rc.left, rc.top, rc.right/2, rc.bottom, TRUE); MoveWindow(EditR, rc.right/2, rc.top, rc.right, rc.bottom, TRUE); が、しかし。。。 右側のエディットが表示されません。他はOK。 これは、右側の垂直スクロールバーがクライアント領域のサイズの 外側に描画されているためでしょうか? 垂直スクロールバーの幅分をどうにか回避しなければ・・・
- histcn
- ベストアンサー率50% (1/2)
ぱっと見で試してはいませんが EditR = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE , rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL); のrc.left / 2の部分がrc.right / 2ではないでしょうか?
お礼
回答ありがとうございます。 よ~く見たところ、ご指摘通りの様でした。 が、しかし。 クライアント領域のサイズを取得して そのサイズ分のところに2つのエディットを作ったはずなのに、 EditLにてY座標がタイトルバーまたはスクロールバーの分ずれていました。 X座標は問題ないと思います。 EditRでは、垂直スクロールバーが作成されておらず、 水平スクロールバーのX座標が、上記と同様にずれています。 Y座標はOKだと思います。 とりあえず、自分でももうちょっと考えてみます。
関連するQ&A
- テキストエディタならばCreateWindow
を使って hEdit = CreateWindow("EDIT",NULL,WS_CHILD| WS_VISIBLE|ES_WANTRETURN|ES_MULTILINE| ES_AUTOVSCROLL|WS_VSCROLL|ES_AUTOHSCROLL| WS_HSCROLL, 0,0,rc.right,rc.bottom,hWnd,(HMENU)ID_EDIT, hInst,NULL); として char Str[1048576]にテキストをおさめ SetWindowText(hEdit,Str); とすればスクロール関数も使う必要なくカレットもでて文字を簡単に編集できるのですが テキストビューワならば文字を変更する必要が無くカレットもでると困るのでこれが使えません また↓や↑で1行スクロールしないといけません (エディタの場合はカレットが上下端にきたときにスクロールだからちょっと違う) DrawTextだとスクロール関数を使わないといけないような気がするし・・・ 見るだけのテキストビューワを作るのに適した方法やC言語SDK関数を教えてください
- ベストアンサー
- C・C++・C#
- Tabでのフォーカス(win32)
edit = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_NUMBER | ES_LEFT , 0 , 0 , 35 , 18 , hWnd , (HMENU)1 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL ); でエディットコントロールを作成しました。 フォーカスがエディットコントロールにある時、TABキーで フォーカスをなくしたいのですが、どうしたらよいでしょうか? デバッガーで追ってみると、WM_KEYDOWNがウィンドウに送られていませんでした。
- 締切済み
- C・C++・C#
- VS2008でEDIT今トーロールがつくれない
VCを学習中です。 書籍の内容をVS2008(VC)で、EDITコントロールを実装使用しますができなくて 困っています。 内容は、 1 VS2008の機能でスケルトンを作成 (メニュー画面とaboutが表示されるものです。MFCとATLは使用していません。) 2 WM_CREATEをWndProcに作成し、CreateWindowを記述 3 実行するとEditコントロールの中にEditコントロールができて、Editコントロールとしては 機能しません。 どなたか、この謎と解決策を教えてください。 ソースの一部分を掲載します。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static HWND hwndEdit; switch (message) { case WM_CREATE: hwndEdit = CreateWindow(TEXT("edit"),L"abcdefghijkl", WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL |WS_BORDER|ES_LEFT|ES_MULTILINE |ES_AUTOHSCROLL|ES_AUTOVSCROLL, 100,100,500,500, hWnd, (HMENU)ID_EDIT, ((LPCREATESTRUCT)lParam)->hInstance,NULL); return 0; case WM_SETFOCUS:
- ベストアンサー
- その他(ソフトウェア)
- エディットボックス内でキー押されたときのメッセージ
VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch( message ) { case WM_CREATE: //エディットボックスを作成 CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","", WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, 0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL ); break; case WM_COMMAND: //エディットボックス内の変更はEN_CHANGEで受け取れるが、 //キーコードは送られてこない break; } }
- 締切済み
- C・C++・C#
- CreateWindowについて
hE=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|ES_READONLY,0,0,100,100,hW,(HMENU)ID_EDIT,hI,NULL); のようにES_READONLYを入れるとエジットコントロールの背面が灰色になってしまうのですがES_READONLYを入れる前のように背面を白いままにしたいのですが何か方法はありませんか。
- ベストアンサー
- C・C++・C#
- Win32APIでのエディットボックスの文字化け
Win32APIでウィンドウズプログラムを組んでいます。 以下のコードで、エディットボックスへの文字列表示が文字化けします。 <エディットボックスの作成> hWndEdit = CreateWindowEx( WS_EX_CLIENTEDGE, _T("EDIT"), NULL, ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD, (int)(WINDOW_W * 0.01), 30, (int)(WINDOW_W * 0.8), (clientRect.bottom-clientRect.top) - 35, hWndMain, (HMENU)IDC_EDITLOG, hInstance, NULL ); <フォントの設定> HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage( hWndEdit, WM_SETFONT, (WPARAM)hFont, TRUE ); <出力文字列の設定> std::ostringstream stream; stream << "************ Start TEST ************\n"; std::string strOut = stream.str(); <出力> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) ); デバッガでの、strOutは、文字化けせずに表示されます。(strOut[0] が、'*'となっている) どこか確認したらよい場所をアドバイスいただけますか?
- ベストアンサー
- C・C++・C#
- 次のようにEditを作成し
hE=CreateWindow ("EDIT",NULL,WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOVSCROLL|WS_VSCROLL|WS_BORDER,0,0,0,0,hWmain,HMENU(IDE),hInst,NULL); 使っていますが SetWindowTextでhEの大容量の文字列を送ったのですが 表示させているエディット画面の下に表示画面一行目が最初から何行目にあるか表示させようと思っています どんなメッセージをそれを送れば取得できるでしょうか? 例えばListでいえば i=(int)SendMessage(hL,LB_GETTOPINDEX,0,0); のようなものを知りたいのです
- ベストアンサー
- C・C++・C#
- C言語win32api、エディットボックスから文字列を取得しメッセージ
C言語win32api、エディットボックスから文字列を取得しメッセージボックスへ出力 質問1 エディットボックスからフォーカスが外れると その中の文字列を取得しメッセージボックスに出力したいのですが 思った通りに出力されません。 フォーカスが外れるとメッセージボックス自体は出てくるのですが エディットボックスに入力した文字列が出力されません。 いろいろ試したんですが文字化けしたり文字列自体が表示されなかったします。 取得と出力の方法を教えていただけませんでしょうか。 kwt[3]=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("EDIT"), NULL , WS_CHILD | WS_VISIBLE | WS_BORDER |ES_LEFT | ES_AUTOHSCROLL , 90 , 85 , 110 , 25 , hAdd ,(HMENU)EDIT_ID02 ,((LPCREATESTRUCT)(lp))->hInstance , NULL); LPSTR testtex=NULL; LRESULT CALLBACK SubProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { LPSTR testtex=NULL; switch(msg) { case WM_COMMAND: switch(LOWORD(wp)) { case EDIT_ID02: if(HIWORD(wp)==EN_KILLFOCUS) //フォーカスが外れたら次の処理をする。 { strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2); //文字数分のメモリを確保 if(testtex) //testtexがゼロでなければ次の処理をする { GetWindowText(hwnd , testtex , GetWindowTextLength(hwnd) + 2); //エディットのテキストを取得。問題個所 MessageBox(hwnd , testtex , TEXT("") , MB_OK); //取得したテキストをメッセージボックスで出力。問題個所 } free(strText); //メモリを解放 return 0; } return 0; } return 0; } return (CallWindowProc(SubP1, hWnd, msg, wp, lp)); } 質問2 エディットボックスに0~9と「.」(ドット)のみを入力できるようにしたいのですが ウインドウスタイルでES_NUMBERを指定すると「.」が入力できなくなってしまいます。 どのように回避したらいいのでしょうか。 質問3 win32apiとは直接関係ありませんが、たとえば計算結果が1000億を超えるような場合 int型とかの変数ではとても入りきれません。 こういった場合どのようにするのでしょう。
- ベストアンサー
- C・C++・C#
- TABによるフォーカス移動
実行環境: Microsoft Visual Studio 2005 質問: TABによるフォーカス移動が行えません。どのようにソースを変更すれば宜しいか教えてください。 以下ソース //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HINSTANCE main_inst; static HFONT main_hfont; main_inst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ) ; static HWND hEdit1,hEdit2,hEdit3; switch (msg) { case WM_SETFOCUS: SetFocus(hEdit1); break; case WM_COMMAND: switch(LOWORD(wp)){ case ID_EDIT1: if(wp == VK_TAB) SetFocus(hEdit2); break; case ID_EDIT2: if(wp == VK_TAB) SetFocus(hEdit3); break; case ID_EDIT3: if(wp == VK_TAB) SetFocus(hEdit1); break; } case WM_CREATE: hEdit1 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 89, 158, 34, hWnd, (HMENU)ID_EDIT1, main_inst, NULL ); hEdit2 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_NUMBER|ES_AUTOHSCROLL, 106, 143, 158, 34, hWnd, (HMENU)ID_EDIT2, main_inst, NULL ); hEdit3 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 198, 158, 34, hWnd, (HMENU)ID_EDIT3, main_inst, NULL ); CreateWindow( TEXT("BUTTON"),TEXT("起動"),WS_CHILD|WS_VISIBLE|BS_MULTILINE|BS_CENTER, 89, 301, 112, 40, hWnd, (HMENU)ID_BUTTON, main_inst, NULL ); main_hfont = CreateFont( -19, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FIXED_PITCH|FF_MODERN, TEXT("MS ゴシック") ); SendDlgItemMessage( hWnd, ID_EDIT1, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT2, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT3, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_BUTTON, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
- 締切済み
- C・C++・C#
- 親ウィンドウの領域外でも表示されるエディットボックスについて
親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
回答&アドバイス、大変ありがとうございました。 おかげさまで、正常に動作した事を確認しました。 かなりのイージーミスでした。 CreateWindow()、MoveWindow()ともに、 引き数の値の意味について誤った認識をしていました。 (左上X座標、左上のY座標、右下のX座標、右下のY座標と) 右下のX座標、右下のY座標ではなく、ウィンドウのサイズでした。 お手数おかけしました。