0
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HWND hDirectives;
    static char inBuffer [256] = "hey";
    static LPWSTR lpszBuffer = (LPWSTR)malloc(256*sizeof(LPWSTR));

    switch (message)
    {
    case WM_CREATE:
        hDirectives = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_BORDER | WS_VISIBLE | SS_RIGHT | SS_SUNKEN | WS_VSCROLL, 
            20, 20, 300, 300, hWnd, (HMENU) ID_DIRECTIVE, ((LPCREATESTRUCT) lParam) ->hInstance, NULL);
        SetWindowLong(hDirectives, GWL_WNDPROC, (LONG) DirectiveProc);
        break;


    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }

    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

LRESULT CALLBACK DirectiveProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    HWND hParent = (HWND)GetWindowLong(hWnd, GWL_HWNDPARENT);
    static int nScrollPos;
    static SCROLLINFO si;
    switch(message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);

    case WM_SIZE:
        si.cbSize = sizeof(si);
        si.fMask  = SIF_RANGE | SIF_PAGE;
        si.nMin = 0;
        si.nMax = 10;
        si.nPage = 5;
        SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
        return 0;

    case WM_VSCROLL:
        si.cbSize = sizeof(si);
        si.fMask  = SIF_ALL;
        GetScrollInfo(hWnd, SB_VERT, &si);

        nScrollPos = si.nPos;
        switch(LOWORD(wParam))
        {
        case SB_THUMBTRACK:
            si.nPos = si.nTrackPos;
            break;
        default:
            break;
        }
        si.fMask = SIF_POS;
        SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
        GetScrollInfo(hWnd, SB_VERT, &si);

        if(si.nPos!=nScrollPos)
        {
            ScrollWindow(hWnd, 0, 5 * (nScrollPos - si.nPos), NULL, NULL);
            UpdateWindow(hParent);
        }
        return 0;
    default:
        DefWindowProc(hWnd, message, wParam, lParam);

    }
    //CallWindowProc(WndProc, hParent, message, wParam, lParam);  wasn't sure if I was supposed to add this
}

そのため、静的コントロールにスクロール機能を追加したくないので、サブクラス化しましたが、問題が発生しています。私がしたくないのは、静的コントロールにテキストを表示してからスクロールしたくないということです。サブクラス化せずに、ウィンドウにテキストを表示できました。サブクラス化すると、コントロールは以前の灰色に対してすべて白で表示され、テキストの設定に失敗します。また、スクロールすると、ユーザーがスクロールするたびにDirectiveProcの親ウィンドウを更新しても、静的コントロールはウィンドウの外側に描画されます。ここでの私の目標は、ユーザーがスクロールできる情報を含む静的コントロールを作成することです。

4

1 に答える 1

0

コメント提供者は、MSDNのMSDNにリストされているサブクラス化ルールに従わないことで、発生している多くの問題をすでに特定しています。

于 2012-12-09T02:18:02.050 に答える