Visual C++ FAQ
Страница 4.


 Как нарисовать рванное окно?
...
   WNDCLASS WndClass;

   WndClass.lpszClassName =(LPSTR)"BalonHelp";
   WndClass.hInstance     =hInstance;
   WndClass.lpfnWndProc   =BalonWndProc;
   WndClass.style         =CS_SAVEBITS; // восстановление возлагаем на Win
>  WndClass.hbrBackground =GetStockBrush(NULL_BRUSH);
   WndClass.hCursor       =LoadCursor(NULL,IDC_ARROW);
   WndClass.hIcon         =NULL;
   WndClass.lpszMenuName  =NULL;
   WndClass.cbClsExtra    =0;
   WndClass.cbWndExtra    =0;

   RegisterClass(&WndClass);
...
LRESULT CALLBACK BalonWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
   switch(msg)
   {
    case WM_PAINT:
>    // отpисовка всего окна ложится на твои плечи :-)
         ...
    case ...
   }
  return DefWindowProc(hWnd,msg,wParam,lParam);
}
Как полностью перекрыть доступ к файлу во время работы с ним?
После создания с помощью следующего кода файл даже не читается:
CreateFile(f,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Как сделать так, чтобы во время выполнения длинного метода приложение реагировало на сообщения?
BOOL ProcessMessages()
{
  MSG msgCur;
  if (!::GetMessage(&msgCur, NULL, NULL, NULL))
   {
   return FALSE;
   }


  // обрабатываем это сообщение

  ::TranslateMessage(&m_msgCur);
  ::DispatchMessage(&m_msgCur);
  return TRUE;
}
Как сделать цикличным проигрывание MIDI-файла?
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
   if(message==MM_MCINOTIFY)
     if(wParam!=MCI_NOTIFY_ABORTED)
     {
           if(m_bIsPlaing)
           {
                   if(SetMidi())
                     PlayMidi();
           }
     }

  return CFrameWnd::WindowProc(message, wParam, lParam);
}

BOOL CMainFrame::SetMidi()
{
   StopMidi();
  MCI_OPEN_PARMS OpenParm;
  OpenParm.dwCallback = (DWORD)GetSafeHwnd();
  OpenParm.lpstrDeviceType = NULL;
  OpenParm.lpstrElementName = filename;
  DWORD flags=MCI_OPEN_ELEMENT;
  MCIERROR err;
  err=mciSendCommand(0, MCI_OPEN, flags,(DWORD)&OpenParm);
   if(!err){
     m_nMidideviceID=OpenParm.wDeviceID;
   return TRUE;
   }
   else
  return FALSE;
}

BOOL CMainFrame::PlayMidi(void)
{
  MCI_PLAY_PARMS PlayParm;
  PlayParm.dwCallback =(DWORD)GetSafeHwnd();
   PlayParm.dwFrom=0;
  MCIERROR err;

err=mciSendCommand(m_nMidideviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)&PlayParm);
   if(!err)
   {
     m_bIsPlaing=TRUE;
   return TRUE;
   }
   m_bIsPlaing=FALSE;
  return FALSE;
}

BOOL CMainFrame::StopMidi(void)
{
   m_bIsPlaing=FALSE;
  MCI_GENERIC_PARMS generic_params;
   generic_params.dwCallback=(DWORD)GetSafeHwnd();
  mciSendCommand(m_nMidideviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&generic_params);
  return TRUE;
}
Как перехватывать ВСЕ исключения в процессе?
       main()
       {
      try {
               ...
           }
      catch(...) {
               ^^^именно так и напиши!
               ...
           }
       }

Так как функция main() совсем не типична для Win32, предлагаю уделить внимание SetUnhandledExceptionFilter().

 
« Предыдущая статья