Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

Visual C++. FAQ. Уроки по программированию с сайта http://progs.biz

Рассылка №35

Visual C++. FAQ. Вопрос 1. Как сменить иконку у формы в период выполнения?
Visual C++. FAQ. Вопрос 2. Как заменить меню в SDI-приложении
Visual C++. FAQ. Вопрос 3. Как добраться до StatusBar из класса документа?
Visual C++. FAQ. Вопрос 4. Как сохранить размер клиентской области при видимой/невидимой строке состояния?
Visual C++. FAQ. Вопрос 5. Как программно изменить разрешение экрана?
Visual C++. FAQ. Вопрос 6. Как превратить CString в char*?

Полные версии уроков (с картинками) можно найти по адресам
Вопрос 1. Как сменить иконку у формы в период выполнения?
Вопрос 2. Как заменить меню в SDI-приложении?
Вопрос 3. Как добраться до StatusBar из класса документа?
Вопрос 4. Как сохранить размер клиентской области при видимой/невидимой строке состояния?
Вопрос 5. Как программно изменить разрешение экрана?
Вопрос 6. Как превратить CString в char*?

FAQ по Visual C++. Вопрос 1. Как сменить иконку у формы в период выполнения?

void CMainFrame::OnNewIcon()
{
    // Прочитать икону из ресурса
    HICON newIcon= AfxGetApp()->LoadIcon(IDI_ICON1);
    SetIcon(newIcon,TRUE); //Установить её
}

Разумеется, иконка с идентификатором IDI_ICON1 должна быть среди ресурсов вашего проекта.

Наверх

FAQ по Visual C++. Вопрос 2. Как заменить меню в SDI-приложении?

В обработчике для смены меню пишем приблизительно следующий код:

void CMainFrame::OnMenuNewMenu()
{
    CMenu* cm=GetMenu();
    cm->DestroyMenu();  //разрушаем старое меню
    cm->LoadMenu(IDR_NEW_MENU); //загружаем новое из ресурса
    SetMenu(cm); //Устанавливаем новое меню
    m_hMenuDefault = cm->GetSafeHmenu();
    cm->Detach();
}

Разумеется, новое меню с ресурсом IDR_NEW_MENU должно быть определено.

Наверх

FAQ по Visual C++. Вопрос 3. Как добраться до StatusBar из класса документа?

    CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
    CStatusBar* pStatusBar = &pFrame->m_wndStatusBar;

Далее пишем всё, что нам надо, например устанавливаем в нулевую панель некую надпись:

    pStatusBar->SetPaneText(0,"Некая надпись");

Обратите внимание, что для нашей цели мы используем два шага - сначала мы добираемся до окна-рамки нашего приложения, а затем - до строки состояния (которая принадлежит классу окна-рамки (CMainFrame)).

Также обратите внимание, что переменную m_wndStatusBar надо будет либо объявить как public, либо объявить класс документа дружественным в классе CMainFrame.

Наверх

FAQ по Visual C++. Вопрос 4. Как сохранить размер клиентской области при видимой/невидимой строке состояния?

void CMainFrame::OnViewStatusBar()
{
    //Выясняем, видима ли строка состояния
    BOOL bStatusBar=m_wndStatusBar.GetStyle() & WS_VISIBLE;
    //Выясняем текущие размеры окна
    CRect r;
    GetWindowRect(&r);
    //В зависимости от видимости/невидимости строки состояния
    //изменяем размер окна 
    if(bStatusBar){
        r.bottom-=18;
    }
    else{
        r.bottom+=18;
    }
    MoveWindow(r);
    //Изменяем видимость строки состояния 
    m_wndStatusBar.ShowWindow(!bStatusBar);
    RecalcLayout();
}
Наверх

FAQ по Visual C++. Вопрос 5. Как программно изменить разрешение экрана?

Вот пример консольной программы, изменяющей разрешение экрана на 600 на 800 с глубиной цвета в 16 бит:

#include <iostream.h>
#include <windows.h>
void main(){
   DEVMODE md;
   ZeroMemory(&md, sizeof(md)); //обнуляем структуру md
   md.dmSize = sizeof(md);

   md.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
   md.dmBitsPerPel = 16;
   md.dmPelsWidth = 800;
   md.dmPelsHeight = 600;
   ChangeDisplaySettings(&md,NULL); //изменяем разрешение экрана
}
Наверх

FAQ по Visual C++. Вопрос 6. Как превратить CString в char*?

Проблема в том, что переменную типа char* легко присвоить переменной типа CString, но обратное присваивание делаться не хочет. Пример одного из возможных способов:

#include <iostream.h>
#include <afx.h>
void main(){
   CString s="123";
   char* ch;
   //копируем s в ch
   ch=s.GetBuffer(s.GetLength());
   cout<<ch<<"\n";
}
Наверх

Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное