Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Класс окна в MFC-приложении


Автор: zhekha 27.3.2006, 12:01
В приложении Win32 можно создавать окна с любым классом, а при создании приложения на базе диалога, MFC сама регистрирует класс окна как Dialog или #32770. Может кто-нибудь знает как его можно поменять? Мне это нужно для однозначной идентификации приложения с целью защиты от повторного запуска (у окна отсутствует TitleBar). Заранее спасибо!

Автор: CaptainFlint 27.3.2006, 12:35
zhekha
В ресурсах пропиши класс:
Код

IDD_MY_DIALOG DIALOGEX 0, 0, 200, 67
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_APPWINDOW
CAPTION "My Dialog"
CLASS "MyDialogClass"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    ...

А в CMyApp::InitInstance() перед созданием диалога добавь следующий код:
Код

    WNDCLASS wc;

    // Get the info for this class.
    // #32770 is the default class name for dialogs boxes.
    ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);

    // Change the name of the class.
    wc.lpszClassName = "MyDialogClass";

    // Register this class so that MFC can use it.
    AfxRegisterClass(&wc);

Автор: Kostt 27.3.2006, 14:24
Для защиты от повторного запуска лучше используй мьютекс
Код

HANDLE Mutex;
    Mutex = CreateMutex( NULL, FALSE, "MyMutex" );
    if( ERROR_ALREADY_EXISTS == GetLastError() ) // Такой мьютекс уже кем-то создан...
    {
        MessageBox( 0, "Приложение уже запущено", "Error", 0 );
        CloseHandle( Mutex );
        exit(0);
    }


Автор: zhekha 28.3.2006, 11:02
CaptainFlint> Все замечательно работает, ещё раз спасибо!
Kostt> Я и так использовал мьютекс, но помимо отключения повторного запуска приложения хотелось активизировать окно уже запущенного процесса, поэтому мне и нужен был уникальный класс окна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)