Элементы управления исчезают, используя динамическое расположение - PullRequest
0 голосов
/ 03 июля 2018

Это действительно странно! У меня есть этот ресурс диалога:

ID_DLG_ASSIGN DIALOGEX 0, 0, 415, 285
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Assignments"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    GROUPBOX        "Date Range ...",IDC_STATIC,7,9,120,91,0,WS_EX_TRANSPARENT
    LTEXT           "&Start Date:",IDC_STATIC,16,18,103,8
    CONTROL         "DateTimePicker1",ID_DTP_ASSIGN_FROM,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,16,28,104,12
    LTEXT           "&End Date:",IDC_STATIC,16,43,103,8
    CONTROL         "DateTimePicker2",ID_DTP_ASSIGN_TO,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,16,54,104,12
    PUSHBUTTON      "&Display Entries",ID_BTN_DISPLAY_ENTRIES,21,76,90,14
    GROUPBOX        "Settings ...",IDC_STATIC,7,101,120,174,0,WS_EX_TRANSPARENT
    LTEXT           "Assignment:",IDC_STATIC,16,113,102,10
    COMBOBOX        IDC_COMBO_ASSIGNMENT,16,124,97,60,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    LTEXT           "Starting Name:",IDC_STATIC,16,143,96,8
    COMBOBOX        ID_CMB_START_NAME,16,154,97,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
    CONTROL         "Include All Dates",IDC_CHECK_INCLUDE_ALL_DATES_CHAIRMAN_READER,
                    "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,19,169,96,16
    CONTROL         "Ignore Local Speakers",IDC_CHECK_IGNORE_LOCAL,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,19,182,96,19
    CONTROL         "&Avoid Conflicts",IDC_CHK_AVOID_CONFLICT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,202,95,10
    LTEXT           "&Weeks to avoid:",ID_STATIC_WEEKS,30,215,94,8
    COMBOBOX        ID_CMB_NUM_WEEKS,42,227,39,44,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON      "A&uto Assign",ID_BTN_AUTO_ASSIGN,21,251,90,14
    GROUPBOX        "Entries ...",IDC_STATIC_ENTRIES,134,9,272,248,0,WS_EX_TRANSPARENT
    CONTROL         "",IDC_STATIC_ASSIGN_GRID,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,141,22,258,204
    PUSHBUTTON      "&Show Conflicts",ID_BTN_SHOW_CONFLICTS,178,237,90,14
    CONTROL         "",ID_STATIC_KEY,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,277,230,122,21
    PUSHBUTTON      "Help",ID_BTN_HELP,134,261,50,14
    PUSHBUTTON      "Print",ID_BTN_ASSIGN_PRINT,189,261,50,14
    PUSHBUTTON      "Undo",ID_BTN_UNDO,245,261,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,301,261,50,14
    DEFPUSHBUTTON   "OK",IDOK,357,261,50,14
    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDVERT | NOT WS_VISIBLE,377,97,1,1
END

Вот данные динамического макета:

ID_DLG_ASSIGN AFX_DIALOG_LAYOUT
BEGIN
    0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 100, 100,
    0, 0, 100, 100,
    100, 100, 0, 0,
    100, 100, 0, 0,
    100, 100, 0, 0,
    100, 100, 0, 0,
    100, 100, 0, 0,
    100, 100, 0, 0,
    100, 100, 0, 0,
    0, 0, 0, 0
END

Теперь есть два конкретных элемента управления:

  • GROUPBOX "Date Range ...",IDC_STATIC,7,9,120,91,0,WS_EX_TRANSPARENT
  • GROUPBOX "Settings ...",IDC_STATIC,7,101,120,174,0,WS_EX_TRANSPARENT

Если я отключу прозрачный флаг и покажу диалоговое окно и изменим размер:

Sized

Хотя это выглядит странно, две групповые рамки остаются видимыми. Но когда я снова включаю прозрачность, как это должно было быть, затем показываю диалог и изменяю его размер:

Sized 2

Они исчезают! Что вызывает это? Смущенный. Подчеркиваю, они есть при первом его отображении (позиция восстановлена). Как только я измеряю размер, проблема возникает. Это OnSize:

void CAssignmentsDlg::OnSize(UINT nType, int cx, int cy) 
{
    CResizingDialog::OnSize(nType, cx, cy);
    CRect rctControl;
    m_lblAssignGrid.GetWindowRect(rctControl);
    ScreenToClient(rctControl);
    m_Grid.MoveWindow(rctControl);
}

А OnPaint:

void CAssignmentsDlg::OnPaint() 
{
    //CResizingDialog::OnPaint();

    CPaintDC dc(this); // device context for painting

    COLORREF    crTextHL, crBackHL;
    COLORREF    crTextOld, crBackOld;
    CString     strText;

    EstablishLegendPosition();

    crBackHL = ::GetSysColor(COLOR_HIGHLIGHT);
    crTextHL = ::GetSysColor(COLOR_HIGHLIGHTTEXT);

    dc.FillSolidRect(m_rcKey, crBackHL);

    crBackOld = dc.SetBkColor(crBackHL);
    crTextOld = dc.SetTextColor(crTextHL);

    strText.LoadString( IDS_STR_SAMPLE_CONFLICT );
    CFont l_font;
    l_font.CreateFont(14, 0, 0, 0, FW_NORMAL,
        FALSE, FALSE, FALSE, 0, 
        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,   
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, _T("Arial"));

    CFont* l_old_font = dc.SelectObject(&l_font);

    dc.DrawText( strText, m_rcKey, DT_SINGLELINE|DT_CENTER|DT_VCENTER );

    dc.SetBkColor(crBackOld);
    dc.SetTextColor(crTextOld);

    // Delete the font object. 
    dc.SelectObject(l_old_font);
    l_font.DeleteObject();

    CRect rc;
    GetClientRect(&rc);
    rc.left = rc.right - ::GetSystemMetrics(SM_CXHSCROLL);
    rc.top = rc.bottom - ::GetSystemMetrics(SM_CYVSCROLL);
    HTHEME ht = OpenThemeData(GetSafeHwnd(), L"STATUS");
    if (ht)
    {
        DrawThemeBackground(ht, dc, SP_GRIPPER, 0, &rc, nullptr);
        CloseThemeData(ht);
    }
    else
    {
        dc.DrawFrameControl(rc, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
    }
}

Я переместил рисунок захвата из базовой базы в этот класс, только если это была проблема. Я не понимаю.

1 Ответ

0 голосов
/ 03 июля 2018

Сортировка. WS_CLIPCHILDREN был виновником. Выключите его, и изменение размера работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...