CDialog не отображается в панели задач - PullRequest
1 голос
/ 02 июля 2010

Я пытаюсь получить CDialog, у которого нет рамки или рамки для отображения на панели задач.

Он создан в InitInstance CWinApp (используется для обновления приложения), и я попытался установить WS_EX_APPWINDOWфлаг, но он все еще не отображается в панели задач.

Есть идеи?

Редактировать: Как определено в ресурсе:

IDD_UPDATEFORM_DIALOG DIALOGEX 0, 0, 246, 124
STYLE WS_POPUP
EXSTYLE WS_EX_APPWINDOW
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END

Использовано:

 UpdateForm *dlg = new UpdateForm(UPDATE_FILES, CWnd::GetDesktopWindow());
 INT_PTR nResponse = dlg->DoModal();


UpdateForm::UpdateForm(int updateType, CWnd* pParent) : CDialog(IDD_UPDATEFORM_DIALOG, pParent)
{
 m_bInit = false;
 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON);
 m_Progress = new DesuraProgress();
 m_updateType = updateType;
}

Все еще отображается так:

http://update.goldeneyesource.net/lodle/noicon.jpg http://update.goldeneyesource.net/lodle/noicon.jpg

Ответы [ 2 ]

2 голосов
/ 02 июля 2010

Редактировать # 2:

Чтобы установить значок для этого окна (по сути, заставки), вы можете отправить окну сообщение WM_SETICON вместе с нужным значком.

Для диалога вы можете сделать это в OnInitDialog().Вот фрагмент, который использует значок информации о окнах по умолчанию, как указано здесь: LoadIcon @ MSDN .

// CHelperDlg message handlers
BOOL CHelperDlg::OnInitDialog()
{
  CDialog::OnInitDialog();

  // 32516 is also known as IDI_INFORMATION
  HICON hIcon = LoadIcon(0, MAKEINTRESOURCE(32516));

  // 0 in WPARAM is 'small version'
  ::SendMessage(GetSafeHwnd(), WM_SETICON, 0, (LPARAM)hIcon);
  // 1 in WPARAM is 'large version'
  ::SendMessage(GetSafeHwnd(), WM_SETICON, 1, (LPARAM)hIcon);

  // No cleanup as HICONs are free from disposal rules.

  return TRUE;  // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE
}

-
Редактировать:

Я создал второй проект для имитации вашего обновления, но не вижу никаких отличий, кроме включения DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) в мой файл .rc.Эти определения стиля диалога не влияют на отображение диалога.

Я загрузил ключевые части для моего минимального примера в http://gist.github.com/461057 для справки, на случай, если вы захотите добавитьэтот диалог впереди вашего для тестирования.

Также я использую VS2010.У меня есть VS2008, если вы хотите, чтобы я повторил этот тест и в этой версии.

-
Оригинал:

Попробуйте указать окно рабочего стола(через CWnd::GetDesktopWindow()) в качестве родительского окна при создании диалога.

// Member Variable
CHelperDlg *dlg;

// Meanwhile, elsewhere...
dlg = new CHelperDlg();
dlg->Create(IDD_HELPERDLG, CWnd::GetDesktopWindow());
dlg->ShowWindow(SW_SHOW);
// or...
// dlg->DoModal();

Кроме того, не забудьте уничтожить диалоговое окно, когда вы закончите с ним, либо в деструкторе классавладелец или другое удобное расположение.

0 голосов
/ 13 июля 2010

Я придумал, как заставить это работать.Вместо того, чтобы отключить стили панели инструментов / заголовка, чтобы не получить границы, я использовал SetWindowRgn, чтобы обрезать рамку и заголовок.То же самое, меньше вопросов.

RECT rect;
GetWindowRect(&rect);
int w = rect.right - rect.left;
int h = rect.bottom - rect.top;

HRGN region = CreateRoundRectRgn(5, 30, w-5, h-5-30, 5, 5);
SetWindowRgn(region, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...