0
<pre>
#include<Windows.h>
#include<process.h>

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
HWND hwnd;
int clientx,clienty;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
    static TCHAR szAppName[]=TEXT("hello");
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.hInstance=hInstance;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.lpfnWndProc=WndProc;
    wndclass.lpszClassName=szAppName;
    wndclass.lpszMenuName=NULL;

    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("this program requires windows NT"),TEXT("wrong"),MB_ICONERROR);
        return 0;
    }
    hwnd=CreateWindow(szAppName,TEXT("random rectangles"),
        WS_OVERLAPPEDWINDOW,
        100,100,800,600,
        NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

VOID Thread(PVOID pvoid)
{
    HBRUSH hbrush;
    HDC hdc;
    int xleft,xright,ytop,ybottom,ired,igreen,iblue;
    while(TRUE)
    {
        if(clientx!=0||clienty!=0)
        {
            xleft=rand()%clientx;
            xright=rand()%clientx;
            ytop=rand()%clienty;
            ybottom=rand()%clienty;
            ired=rand()%255;
            igreen=rand()%255;
            iblue=rand()%255;

            hdc=GetDC(hwnd);
            hbrush=CreateSolidBrush(RGB(ired,igreen,iblue));
            SelectObject(hdc,hbrush);

            Rectangle(hdc,min(xleft,xright),min(ytop,ybottom),max(xleft,xright),max(ytop,ybottom));
            ReleaseDC(hwnd,hdc);
            DeleteObject(hbrush);
        }
    }//while
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_CREATE:
        _beginthread(Thread,0,NULL);
        return 0;
    case WM_SIZE:
        clientx=LOWORD(lParam);
        clienty=HIWORD(lParam);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}
<code>

プログラムの先頭にある変数 clientx と clienty が、プログラムの実行時に値 s を取得する方法がわかりません...プログラムに値の割り当てが見られなかったので....以前は自分でデバッグしていましたVisual Studio 2010 で、WinMain() で "ShowWindow(hwnd,iCmdShow);" を実行すると、clientx と clienty は値を取得しました (735 と 654 ランダム...)。 0」。私は混乱しました~~どうもありがとう~~~ :)

4

3 に答える 3

0

明示的にゼロに初期化されていないのに、両方の値がゼロである理由を尋ねていると思います。clientxclienty

グローバル変数asclientxおよびclienty、には静的ストレージ期間があります。静的保存期間の変数が明示的に初期化されていない場合(セクション6.7.8 C99標準の初期化から):

  • ポインタ型の場合は、nullポインタに初期化されます。
  • 算術タイプの場合、(正または符号なし)ゼロに初期化されます。
  • 集合体の場合、すべてのメンバーはこれらのルールに従って(再帰的に)初期化されます。
  • ユニオンの場合、最初に指定されたメンバーは、これらのルールに従って(再帰的に)初期化されます。
于 2012-09-26T07:56:11.613 に答える
0

クライアント x とクライアント y は、グローバルであるため (hmjd で言及されているように) ゼロに初期化されます。

アプリケーションが開くと、Windows は WM_RESIZE メッセージをウィンドウ プロシージャに送信して、ウィンドウの大きさを通知します (ユーザーがウィンドウのサイズを変更すると、このメッセージが再度送信されます)。下の方に、RESIZE メッセージのパラメーターに従って clientx と clienty が設定されているコードが表示されています。基本的には、クライアント ウィンドウの高さと幅 (ピクセル単位) です。

于 2012-09-26T08:03:15.740 に答える
-1

これらの値は、以前のセッションから取得されます。トップレベル ウィンドウを閉じると、Windows はそのサイズと位置を記憶します。

http://support.microsoft.com/kb/235994

Windows は、閉じたウィンドウのサイズと場所の情報を次のレジストリの場所に保存します: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams

Windows は、最大 28 個の異なるウィンドウのサイズと位置情報を保存します。各ウィンドウのサイズと位置のパラメーターは、Streams キーのサブキーに格納されます。

于 2012-09-26T10:31:38.263 に答える