• 締切済み

CreateStatusWindowの第2引き数の書き換え

ステータスバー HWND CreateStatusWindow( LONG style, // ウィンドウスタイル LPCTSTR lpszText, // 第1区画に表示される文字列 HWND hwndParent, // 親ウィンドウハンドル UINT wID // ステータスバーのID ); の第2引き数の書き換えはどのように行えばよいのでしょうか? 猫でも分かるC++の第59章 ステータスバーを作る その3 http://www.kumei.ne.jp/c_lang/sdk/sdk_59.htm を参考にしているんですが、ステータスバーの文字を、他のウインドウに 隠れてしまっても保持するようにさせる方法が分かりません。 第2引き数の書き換えができればそれは可能になると思います。 上記サイトではSetTimerとSB_SETTEXTを使用して、それと同等の表示効果を実現できていますが、 もっとよい方法(第2引き数の書き換え)などができるのではないかと思いました。

みんなの回答

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

質問の内容がわかりにくいのですが、わかる範囲で回答します。 >ステータスバー HWND CreateStatusWindow( LONG style, // ウィンドウスタイル LPCTSTR lpszText, // 第1区画に表示される文字列 HWND hwndParent, // 親ウィンドウハンドル UINT wID // ステータスバーのID ); の第2引き数の書き換えはどのように行えばよいのでしょうか? 本当にCreateStatusWindow()の第2引数を変えたいのであれば、lpszTextを書き換えておくだけです。(もしくは、引数を文字列リテラルで直接指定する。)そうではなくて、作成されたステータスバーの第1区画に表示される文字列を変えたいのであれば、「猫でも...」のサンプルのようにSB_SETTEXTを送信するかSetWindowText()を使います。 >ステータスバーの文字を、他のウインドウに 隠れてしまっても保持するようにさせる方法が分かりません。 一度、他のウィンドウの下に隠れた後で再度表示された時、隠れる前と同じ文字列を表示する、という意味でしょうか? それでしたら、特別な事をする必要はないと思いますが...。 >上記サイトではSetTimerとSB_SETTEXTを使用して、それと同等の表示効果を実現できていますが、 このサンプルでタイマーを使用しているのは、時間変化する「空物理メモリ」の値を表示するためですよね? ステータスバーが他のウィンドウに隠れる事とは関係ないと思います。 質問内容を読み違えている可能性があるので、もし違っていたら補足してください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • OCXのメソッドの引数に文字列を返したい

    こんにちは。いつもお世話になっております。 早速ですが質問させて下さい。 VisualC++のClassWizardにて作成したメソッドの引数に文字列を返したいのですがどうすればよいでしょうか。 例えば、「test.ocx」というOCXにGetFileNameというメソッドを追加したとします。 ---<GetFileName>--- UINT GetFileName( LPCTSTR FilePath, //ファイルフルパス LPCTSTR FileName //ファイル名 ) ------------------- ---<VBからの呼び出し>--- FilePath = "C:\Program Files\test.txt" ret = obj.GetFileName(FilePath, FileName) 'ここでFileNameに値を返したい ------------------------ ここでFileNameにOCXから値を返すようにしたいのですが、型(ClassWizardパラメータリストの「タイプ」)は何になるのでしょうか。 数値を返す場合は、「long*」でできたのですが、 文字列を返す方法が分かりません。(「LPCTSTR*」というのもないですし) どうかご教示下さい。 <環境> Windows 2000, Visual C++ 6.0, Visual Basic 6.0

  • GetDCの引数や戻り値

    タイトルに記載の関数に限らないのですが、msdnなどを見ると、 同じ関数でも引数と戻り値が異なるのですが、どういう事か教えていただけないでしょうか? 例)GetDCの場合 HDC GetDC( HWND hWnd // ウィンドウのハンドル ); 一方では CDC* GetDC( ); SDKとMFCの違いという事でしょうか? もしその場合、MFCのソースにてSDKの関数は記述できないという事でしょうか? というか、MFCとかSDKっていうのは何に依存するのでしょうか? (プロジェクト?クラス?) 思いっきり初心者なのでどなたか教えてくださいm(__)m または、参考になるホームページなどがございましたらご教授願いますm(__)m

  • C言語の自作関数がエラーになる

    C言語の自作関数がエラーになる 現在C言語でWindowsのプログラミングを学習中ですが あるプロトタイプ宣言した自作の関数がエラーになってしまいます。 エラー内容は「未解決の外部シンボル・・・」といった内容です。 関数の引数をHWNDだけにした場合は問題ありませんでした。 環境はMicrosoft Visual C++ 2008 Express Editionです。 自作関数の引数に型の制限はあるのでしょうか? よろしくお願いします。 以下コード一部です LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int MySave(TCHAR *,HWND,int); ・ ・ ・ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { THCAR buffer[1024]; int iCount; ・ ・ ・ MySave(buffer,hWnd,iCount); ・ ・ ・ } int MySave(buffer,hWnd,iCount); ・ ・ ・ }

  • ステータスバーを作ろうとしてもリンクエラー

     WindowsのWin32APIだけを用いてプログラムを作成中なのですが、どうしてもステータスバーは作成されません。  ステータスバーを作る(はず)の関数をコメントアウトするとステータスバーがないプログラムができます。 環境---- Windows2000Pro VisualStudio .NET 2003 Academic ソース------ (ユーザー関数は別の名前です。) #include<commctrl.h> HWND hStatus; //ステータスバー用のウィンドウハンドル int Proc(HWND hwnd, ... )//親ウィンドウ、ほかにも引数あり { : : InitCommonContorls(); hStatus=CreateStatusWindow(WS_CHILD|WS_VISIBLE, "AAAAAAAAAA",//適当な文字列 hwnd, ID_STATUS);//#define...で定義済みの定数 : : } エラー----- LNK2019:未解決のシンボル"InitCommonControls"がProcで参照されました。 LNK2019:未解決のシンボル"CreateStatusWindow"がProcで参照されました。

  • textboxに文字列を挿入したい。

    すみません。 質問があります。 VB6.0 windows2000 AファイルのFormの中にtextBoxを作成します。 BファイルにsendMessageAPIを使ってAファイルのTextBoxに文字列を送りたいのですが、うまくいきません。 sendMessage(hWnd,WM_SETTEXT,0,"テスト") FindWindowを使って、hWndのハンドルを取得したいのですが、うまくいきません。 他にハンドルの取り方ってあるのでしょうか? また、sendMessageのだい4引数は文字列を挿入しても文字化けを起こします。どうしてかよくわかりません。 どうしてもうまくいかないのですみませんが、ご存知の方いたら教えてください。

  • SDKでのエラーなのですが。

    はじめまして。 SDKの勉強で猫でもわかる~のHPの第37章のサンプルを実行したのですが、 --------------------構成: 037 - Win32 Debug-------------------- コンパイル中... main.cpp D:\SDK\037\main.cpp(230) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 D:\SDK\037\main.cpp(248) : error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー 037.exe - エラー 2、警告 0 というようなエラーが出てしまいました。 このエラーを回避するにはどのようにすればいいのでしょうか?

  • BccDeveloperでコマンドラインの引数を拾えない

    最近、新しいWindows XPマシンにBorland C++5.5とBcc Developerをインストールしました。 以下のような簡単なプログラムを入れて、コマンドラインの引数を拾えるかチェックしたのですが、長さ0の文字列が帰ってきてしまいます。 不思議なことに、TurboDebuggerだとうまく引数が拾えます。 実行ファイルを直接に実行すると拾えるので、BccDeveloperが実行する際に引数を渡していないように思います。 どなたか、原因として思いつく方はいらっしゃいますか? よろしくお願いいたします。 #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { MessageBox(HWND_DESKTOP, lpCmdLine, "Command Line", MB_OK); return 0L; }

  • MDIのメモ帳もどきにセーブ・ロード機能をつけるには

    猫でもわかるプログラミング WINSDK編 83章~85章のMDIのメモ帳もどきにセーブ・ロード機能を 付けるには、どうすればいいんですか? http://www.kumei.ne.jp/c_lang/sdk/sdk_83.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_84.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_85.htm MDIのドキュメントウィンドウのウィンドウハンドルを取得したら、 (これは前回質問して分かりました。hChildがハンドルですね?) その子ウィンドウであるエディットボックスのウィンドウハンドルを 取得したいんですが、どうすればいいですか? 要するに、「猫でもわかるWindowsプログラミング第2版」の int MyOpen(HWND hEdit);int MySaveAs(HWND hEdit);に手を加えるだけで テキストファイルを操作したいんです。

  • ウィンドウの作成がうまくいきません。

    C++で一からWin32Apiでウィンドウを作ろうとしています。 単発のウィンドウ表示はうまくいったのですが、複数のウィンドウを表示しようとすると動作が怪しくなります。 以下にプログラムを載せさせて頂きますのでご指摘お願いします。 (1)LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)の関数でメインウィンドウの処理を行っているのですが、メインウィンドウ上で「a(0x61)」キーを入力したとき新しくサブウィンドウを表示させています。その表示したサブウィンドウを閉じて再度メインウィンドウから「a(0x61)」キーを入力してサブウィンドウを表示しようとしても応答がありません。原因と改善方法を教えていただけるとうれしいです。 (2)そのほか全体的に「この記述おかしいだろう」「こうしたほうがいいんじゃないか」など細かいところでも良いので教えていただけるとうれしいです。 よろしくお願いします。 #include <Windows.h> class C_BaseWnd { public: C_BaseWnd(); virtual ~C_BaseWnd(); virtual HRESULT Init( HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag ); virtual void Uninit(void); protected: WNDCLASSEX m_wndClassEx; HWND m_hWnd; // 親のウィンドウプロシージャ virtual LRESULT LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // 子のウィンドウプロシージャ virtual LRESULT ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); private: // 個々のウィンドウプロシージャを呼び出すコールバック static LRESULT CALLBACK s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // メインウィンドウフラグ格納 bool m_bMain; }; int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow ) { // 初期化処理 C_BaseWnd *window = new C_BaseWnd(); window->Init( hCurInst, nCmdShow, "Application Name", "Window Name", 1280, 720, WS_OVERLAPPEDWINDOW, true ); MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg); } window->Uninit(); delete window; return 0; } C_BaseWnd::C_BaseWnd() { m_hWnd = NULL; m_bMain = false; } C_BaseWnd::~C_BaseWnd() { } HRESULT C_BaseWnd::Init(HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag) { m_wndClassEx.cbSize = sizeof(WNDCLASSEX); m_wndClassEx.lpfnWndProc = s_CallWindProc; m_wndClassEx.style = (CS_HREDRAW | CS_VREDRAW); m_wndClassEx.cbClsExtra = 0; m_wndClassEx.cbWndExtra = 0; m_wndClassEx.hInstance = hInst; m_wndClassEx.hIcon = NULL; m_wndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); m_wndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); m_wndClassEx.lpszMenuName = NULL; m_wndClassEx.lpszClassName = className; m_wndClassEx.hIconSm = NULL; if( RegisterClassEx(&m_wndClassEx) == 0 ) return E_FAIL; m_hWnd = CreateWindowEx( 0, className, windowName, style, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInst, NULL); if( m_hWnd == NULL ) return E_FAIL; // 自身をウィンドウハンドルにセットする SetWindowLong( m_hWnd, GWL_USERDATA, (LONG)this ); ShowWindow(m_hWnd, nCmdShow); UpdateWindow(m_hWnd); if( windowFlag ) m_bMain = true; return S_OK; } void C_BaseWnd::Uninit(void) { UnregisterClass(m_wndClassEx.lpszClassName, m_wndClassEx.hInstance); } LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: if( wParam == 0x61 ) { // サブウィンドウ初期化処理 C_BaseWnd *window2 = new C_BaseWnd(); window2->Init( (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), SW_SHOW, "Application Name2", "Window Name2", 1920, 1080, WS_OVERLAPPEDWINDOW, false ); } break; case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT C_BaseWnd::ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: break; case WM_CLOSE: break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT CALLBACK C_BaseWnd::s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // セットした個別のインスタンスを取得 C_BaseWnd *pInst = (C_BaseWnd *)GetWindowLong(hWnd, GWL_USERDATA); if( !pInst ) { return DefWindowProc(hWnd, msg, wParam, lParam); } if( pInst->m_bMain ) { return pInst->LocalWindProc(hWnd, msg, wParam, lParam); } else { return pInst->ChildWindProc(hWnd, msg, wParam, lParam); } }

  • windows7のエクスプローラをVBAで操作-1

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。 最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。 なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。 よろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal MSG As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long Const WM_SETTEXT = &HC Private hwnd As Long Private FOLDER As String Sub Put_folder_name1() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) FOLDER = "\\xx.xx.xx.xx\test" RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER) end sub