6

C言語でスチームテーブル方程式解法を開発したのですが、黒い画面のコンソールに値を入力するのは退屈です。

だから私は厳密にCでシンプルなGUIを作りたいと思っていました.

hello world コードを検索しましたが、どれもかなり長かったです。でもこれだけは理解できました。

#include <windows.h>

int main()
{
MessageBoxA( NULL, "Hello World!", "Hello", MB_OK );
}

CのGUIビルダーを使用して、このコードを取得しました.COMMANDBUTTON1のクリックでTEXTBOX1とTEXTBOX2から値をスキャンし、出力をTEXTBOX3に表示する方法を考えてまし?

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include "hello.auto.h"


HWND hwnd_Label1, hwnd_Label2, hwnd_TextBox1, hwnd_TextBox2, hwnd_CommandButton1,
hwnd_TextBox3;

HFONT MSSansSerif_8pt;



void CreateChildWindows(HWND hwndMainWindow, HINSTANCE hInstance)
{
InitCommonControls();

MSSansSerif_8pt = CreateFont(-11,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,"MS Sans Serif");

hwnd_Label1 = CreateWindowEx(0, "Static", "Pressure",
    WS_CHILD | WS_VISIBLE,
    11, 55, 95, 38, hwndMainWindow,
    (HMENU)Label1, hInstance, NULL);

SetWindowFont(hwnd_Label1, MSSansSerif_8pt, TRUE);

hwnd_Label2 = CreateWindowEx(0, "Static", "Temperature",
    WS_CHILD | WS_VISIBLE,
    11, 110, 95, 38, hwndMainWindow,
    (HMENU)Label2, hInstance, NULL);

SetWindowFont(hwnd_Label2, MSSansSerif_8pt, TRUE);

hwnd_TextBox1 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    187, 55, 83, 35, hwndMainWindow,
    (HMENU)TextBox1, hInstance, NULL);

SetWindowFont(hwnd_TextBox1, MSSansSerif_8pt, TRUE);

hwnd_TextBox2 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    187, 99, 83, 35, hwndMainWindow,
    (HMENU)TextBox2, hInstance, NULL);

SetWindowFont(hwnd_TextBox2, MSSansSerif_8pt, TRUE);

hwnd_CommandButton1 = CreateWindowEx(0, "Button", "CommandButton1",
    WS_CHILD | BS_MULTILINE | BS_PUSHBUTTON | WS_VISIBLE,
    308, 77, 117, 52, hwndMainWindow,
    (HMENU)CommandButton1, hInstance, NULL);


SetWindowFont(hwnd_CommandButton1, MSSansSerif_8pt, TRUE);

hwnd_TextBox3 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit" , NULL,
    WS_CHILD | ES_WANTRETURN | WS_VISIBLE,
    66, 220, 385, 35, hwndMainWindow,
    (HMENU)TextBox3, hInstance, NULL);

SetWindowFont(hwnd_TextBox3, MSSansSerif_8pt, TRUE);

return;
}



HWND GetItem(int nIDDlgItem)
{
switch(nIDDlgItem)
{
    case -1:
        return GetParent(hwnd_Label1);
    case Label1:
        return hwnd_Label1;
    case Label2:
        return hwnd_Label2;
    case TextBox1:
        return hwnd_TextBox1;
    case TextBox2:
        return hwnd_TextBox2;
    case CommandButton1:
        return hwnd_CommandButton1;
    case TextBox3:
        return hwnd_TextBox3;
    default: return NULL;
}
}



void Form_Unload(HWND hMainWnd)
{
DeleteFont(MSSansSerif_8pt);
return;
}

何度も挑戦しましたがだめでした。良いサイトのリンクをくれたとしても、私はとても助かります。

4

2 に答える 2

8

あなたは、C を使用した Win32 API プログラミングに関する優れた本を探しています。幸運なことに、ほとんどの人が C を学ぶために使用する素晴らしい本があります。これは Charles Petzold によって書かれ、(適切に) Programming Windowsと呼ばれています。Win32 プログラミングについて説明している最新版である第 5 版が必要です。

「Win32 プログラミング」で検索すると、オンラインで利用できるさまざまなチュートリアルもあります。ただし、それらの多くにはエラーや誤解 (ANSI 文字列と Unicode 文字列の違いなど) が含まれており、良いものはかなり短く不完全です。重要なプログラムを作成するために必要なすべてをオンライン チュートリアルから学べるわけではありませんが、非常に簡単なことを画面に表示できるはずです。これは theForger によるもので、何度も推奨されているものです。

ただし、コンソール プログラムの画面に単純にテキストを表示するよりも、GUI コードを (特にこのような低レベルで) 書くほうがはるかに冗長になる傾向があることに注意してください。最終的には、GUI を機能させるためだけに使用され、プログラムのロジックとは何の関係もない一連のコードを作成することになります。最初に C 言語を学習すると、はるかに簡単になります。これは、単純なコンソール タイプのテキストのみのプログラムを使用して行うのが最適です。


特定の質問については、画面上に という名前の 3 つのテキスト ボックス コントロールを作成しましたhwnd_TextBoxX。ここで、Xは 1 から 3 までの数値です。おそらく既にご存じのとおり、はウィンドウへのハンドル (wnd) をhwnd示しているため、これらの変数はハンドルを保持します。テキストボックスウィンドウに。

Win32 API は、特定のウィンドウからテキストを取得するために使用できるGetWindowText関数を提供します。hWnd目的のウィンドウへのハンドル ( )、文字バッファーへのポインター、およびバッファーの長さを示す整数値を渡します。すでに、C 言語の醜い性質が現れています。関数を正しく呼び出すには、C で文字列がどのように機能するかを理解する必要があります。

テキスト ボックスの 1 つに表示された文字列を取得したら、ウィンドウ ハンドル ( ) と文字列を含むバッファーへのポインターのみを受け取る同様のSetWindowText関数を使用して、別のテキスト ボックス ウィンドウに表示できます。hWnd

コードは次のようになります。

// Get the text displayed in textbox 1
TCHAR szBuffer[100];
GetWindowText(hwnd_TextBox1, szBuffer, 100);

// Display that text in textbox 3
SetWindowText(hwnd_TextBox3, szBuffer);

ボタンのクリックに応答してこれを行うには、「イベント」に相当する Win32 のウィンドウ メッセージについて学習する必要があります。ボタン コントロールのような子ウィンドウは、ユーザーがクリックするなど、潜在的に興味深い何かが発生すると、親ウィンドウ (つまり、ダイアログ) に通知メッセージを送信します。

特に、ボタン コントロールはメッセージを通じて親にBN_CLICKED通知を送信します。メイン ウィンドウのウィンドウ プロシージャ ( ) メソッドでメッセージを処理することにより、パラメータがボタン コントロールのウィンドウ ハンドル ( ) と一致し、通知コードと一致することを確認できます。WM_COMMANDWM_COMMANDWndProclParamhWndHIWORD(wParam)BN_CLICKED

そのためのステップバイステップのサンプルコードを含む優れた本が絶対に必要です。スタック オーバーフローの回答で完全に説明するのは少し難しすぎます。

于 2012-08-02T03:50:44.447 に答える
3

Win32 API だけを使用して GUI アプリケーションを作成するのは楽しいことですが、退屈でもあります。ある種のフレームワークを使用する方がはるかに簡単です。これは、しかし、それが不可能であるという意味ではありません。ここでは、その方法について簡単に説明します。

まず、mainルーチンをWinMainに置き換えます。このルーチンは、アプリケーションの新しいエントリ ポイントです。ウィンドウの作成とメッセージ ディスパッチ ループの設定を担当します。

「窓」だけでなく、「窓」と言ったことに注意してください。WinAPI では、「フォーム」に表示されるすべての「コントロール」は「ウィンドウ」です。「フォーム」自体もウィンドウです。すべてのウィンドウにはウィンドウ ハンドル ( HWND) があります。CreateWindowを使用してアプリケーション ウィンドウを作成できます。CreateChildWindowsこれにより、GUI ビルダーが作成した関数に渡すことができるウィンドウ ハンドルが得られます。これにより、アプリケーション ウィンドウに子ウィンドウ (コントロール) が追加されます。

次に、これらすべてのウィンドウをプログラムする必要があります。これは、メッセージを処理することによって行います。アプリケーション ウィンドウを作成するときは、ウィンドウ プロシージャを指定する必要があります。この手順は、受信したメッセージに応答します。たとえば、ボタンをクリックするWM_COMMANDと、処理する必要があるメッセージが表示されます。最後に行うことは、メッセージ処理ループを開始することです。このループは、着信メッセージに対してWinMain繰り返し呼び出しを行います。WndProc

他の回答にリンクされているチュートリアルを実行すると、これはすべて意味をなすようになります。そうすると、おそらくこれに飽きて、GUI ツールキットを手に入れるでしょう :)

于 2012-08-02T04:05:00.417 に答える