Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

MFC

CStatic をはみ出さない様に

ダイアログ上の CStatic をはみ出さない様に描画する

CDC::IntersectClipRect 

   ...
   CClientDC dc(&m_Image) ;
   CRect  rect ;
   m_Image.GetClientRect(rect) ;
   dc.IntersectClipRect(rect) ;
   ...
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

コンボボックスの高さ指定

//*******************************************************************************
//	関数名	:コンボボックスの高さを,親ウィンドウの下に合わせる
//	作成日	:’09/07/01
//*******************************************************************************
#ifndef CBM_FIRST       // C:Program Files (x86)Microsoft SDKsWindowsv7.0AIncludeCommCtrl.h
#define CBM_FIRST               0x1700       // Combobox control messages
#define CB_SETMINVISIBLE        (CBM_FIRST + 1)
#define CB_GETMINVISIBLE        (CBM_FIRST + 2)
#define CB_SETCUEBANNER         (CBM_FIRST + 3)
#define CB_GETCUEBANNER         (CBM_FIRST + 4)
#endif

BOOL	FitDropHeight	(CComboBox* ctrl,CWnd* parent)
{
  if (ctrl == NULL)              			{	return	FALSE ;	}
  if (ctrl->m_hWnd == NULL) {	return	FALSE ;	}
  CRect	tRect ;
  ctrl->GetWindowRect (&tRect) ;
  parent->ScreenToClient(&tRect) ;
  CRect	pRect ;
  parent->GetClientRect(&pRect) ;
  tRect.bottom= pRect.bottom ;
  ctrl->MoveWindow(&tRect) ;
  	 // ここから上は,Visual Style が無効な exe の時に動作する
  {	 // ここから下は,Visual Style が有効な場合に必要	MoveWindow では変更されない?
    int	minV = tRect.Height()/ctrl->GetItemHeight(0) ;
    if (minV >= 3)	{	minV-= 2 ;	}
    if (minV <= 0)	{	minV = 1 ;	}
    ctrl->SendMessage(CB_SETMINVISIBLE,minV) ;
    }
  return	TRUE ;
  }

CB_SETCUEBANNER
CComboBox::SetCueBanner

Windows Vista コントロールの拡張


Windows Vista コモン コントロールの作成要件


サポートされなくなった ANSI API

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


DDX/DDV の順番を…

順番をいじってしまうと,入力中の最大チェックが働かなかったり,値の修正ができない様になってしまう.

 DDX_Text     (pDX, IDC_TEXT_1 , m_Text1);
 DDV_MaxChars (pDX,    m_TEXT1 , 25);
 DDX_Text     (pDX, IDC_TEXT_2 , m_Text2);
 DDV_MaxChars (pDX,    m_TEXT2 , 25);
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

CCriticalSection と CMutex

それぞれ,500,000 回呼出した時間 (m sec) 

      P4       VirtualPC     Xeon    
CCriticalSection 734 160 94
*1 78 20 15
CMutex 8200 710 1140
*1 950 250 437
Profile          INI 2900 950 920
Reg 2100 570 740

  ElapseTick et_cs ;
  {
     CCriticalSection cs ;
     for (int index=0 ; index<500000 ; index++) {
     //CCriticalSection cs ;
        cs.Lock() ;
        cs.Unlock() ;
        }
     }
  DWORD e_cs = et_cs.GetElapse() ;

  ElapseTick et_me ;
  {
     CMutex mt ;
     for (int index=0 ; index<500000 ; index++) {
       mt.Lock() ;
       mt.Unlock() ;
       }
     }

  DWORD e_me = et_me.GetElapse() ;

  ElapseTick et_pr ;
  {
     Profile profile ;
     for (int index=0 ; index<500000 ; index++) {
       int data = profile.GetInt(_T("Test"),_T("Test"),100) ;
       }
     }
  DWORD e_pr = et_pr.GetElapse() ;

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

MFC Static → DLL

MFC を「スタティック ライブラリ」から「共有 DLL」に変更した時,以下のエラーになることがある.
—— ビルド開始: プロジェクト: Project , 構成: Release Win32 ——
コンパイルしています…
StdAfx.cpp
C:Program FilesMicrosoft Visual Studio 8VCatlmfcincludeafx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
Project – エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
*.vcproj をエディタで開き,"$(NoInherit)" を削除


2010/04/21 追記
—— ビルド開始: プロジェクト: Project , 構成: Release Win32 ——
StdAfx.cpp
C:Program Files (x86)Microsoft Visual Studio 10.0VCatlmfcincludeafxver_.h(81): fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
プロジェクトの「プロパティ」-「構成プロパティ」-「C/C++」-「コード生成」-「ランタイムライブラリ」
マルチスレッド (/MT) → マルチスレッド DLL (/MD)


2021/06
https://mish.myds.me/wordpress/dev/2021/01/23/vc-12-lnk1104-vc14-2-lnk2019/
https://mish.myds.me/wordpress/dev/2021/04/01/change-mfc-static-error/

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

FileVer.* を使用した CAboutDlg

CAboutDlg を表示する時に IDC_STATIC による固定的な情報を使用するのではなく,バージョンリソースを使用する

  1. IDD_ABOUTBOX の IDC_STATIC を IDC_FV_DESCRIPTION_VERSION と IDC_FV_LEGAL_COPYRIGHT に変更.
  2. IDC_FV_XXX で始まる使用できるものは,FileVer.cxx を参照.個別の12個と組合せの1個を用意 . 
  3. CAboutDlg::OnInitDialog() で,SetAboutFileVer(this) を呼び出す. 
  4. リンク時に Version.lib がなければ追加.

http://cid-535f5973454c1292.skydrive.live.com/embedicon.aspx/.Public/MFC/FileVer.zip
FileVer.zip

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

Outlook で配信不能になる

2018/04/06 新しく書き直し


受信者をコードで指定していると Outlook で配信不能になる(OE では問題ない).

配信不能 : Subject
システム管理者
送信日時 2010/02/19(金) 21:20
宛先   **********


このメールは、受信者全員または一部に届きませんでした。
件名: Subject
送信日時: 2010/02/19 21:20
以下の受信者にメールを配信できません: 
‘user@*******.com’ 2010/02/19 21:20
この受信者へ配信できる電子メール アカウントはありません。


受信者のメールアドレスを設定する時,_T("smtp:") を付加する

// DOCMAPI.CPP  CDocument::OnFileSendMail
//*******************************************************************************
// 関数名 :ファイルの送信
// 作成日 :’06/06/23
//*******************************************************************************

BOOL SendMail::Send (void) const
{
  if (!IsSupport()) { return FALSE ; }
  CheckSizeAlert() ;
  // MultiByte の必要があるようなので,UNICODE の時のバッファをここに登録する
  LateDelete ld ;
  // 添付ファイルの準備
   int fileCount = 0 ;
   CArray<MapiFileDesc,MapiFileDesc> fileDescA ;
   int index = 0 ;
   for (index=0 ; index<PathNames.GetSize() ; index++) {
      CString pathName = PathNames[index] ;
      if (::FileIsNothing (pathName)) { continue ; }
      if (::FileIsDirectory(pathName)) { continue ; }
      MapiFileDesc fileDesc ;
      memset(&fileDesc,0,sizeof(MapiFileDesc)) ;
      fileDesc.nPosition = (ULONG)-1 ;
      #ifdef _UNICODE
        fileDesc.lpszPathName = SendMail__ChangeMultiByte(PathNames[index],&ld) ;
        fileDesc.lpszFileName = SendMail__ChangeMultiByte(FileNames[index],&ld) ;
      #else
        fileDesc.lpszPathName = LPSTR(LPCTSTR(PathNames[index])) ;
        fileDesc.lpszFileName = LPSTR(LPCTSTR(FileNames[index])) ;
      #endif
      fileDescA.Add(fileDesc) ;
      fileCount++ ;
      }
    // 受信者の準備
    int recipCount = 0 ;
    CArray<MapiRecipDesc,MapiRecipDesc> recipDescA ;
    CStringArray recipName ;
    CStringArray recipAddr ;
    for (index=0 ; index<Recipient.GetSize() ; index++) {
        recipName.SetAtGrow(index,Recipient[index]) ;
        recipAddr.SetAtGrow(index,Recipient[index]) ;
        if (IsAddressAddSMTP()) {
            recipAddr.SetAtGrow(index,_T("smtp:")+Recipient[index]) ;
            }
        }
    for (index=0 ; index<Recipient.GetSize() ; index++) {
      MapiRecipDesc recipDesc ;
      memset(&recipDesc,0,sizeof(MapiRecipDesc)) ;
      recipDesc.ulRecipClass = MAPI_TO ;
      #ifdef _UNICODE
        recipDesc.lpszName = SendMail__ChangeMultiByte(recipName[index],&ld) ;
        recipDesc.lpszAddress = SendMail__ChangeMultiByte(recipAddr[index],&ld) ;
      #else
        recipDesc.lpszName = (LPSTR)((LPCTSTR)(recipName[index])) ;
        recipDesc.lpszAddress = (LPSTR)((LPCTSTR)(recipAddr[index])) ;
      #endif
      recipDescA.Add(recipDesc) ;
      recipCount++ ;
      }
    MapiMessage message ;
    memset(&message,0,sizeof(message)) ;
    message.nFileCount = fileCount ;
    message.lpFiles = fileDescA.GetData() ;
    message.nRecipCount = recipCount ;
    message.lpRecips = recipDescA.GetData() ;
    #ifdef _UNICODE
       message.lpszSubject = SendMail__ChangeMultiByte(GetSubject(), &ld) ;
       message.lpszNoteText = SendMail__ChangeMultiByte(GetNoteText(), &ld) ;
    #else
       message.lpszSubject = LPSTR(LPCTSTR(Subject)) ;
       message.lpszNoteText = LPSTR(LPCTSTR(NoteText)) ;
    #endif
    CWnd* mainWnd = AfxGetMainWnd() ;
    #if(_MFC_VER >= 0x0700)
       ULONG_PTR hWnd = (ULONG_PTR)mainWnd->GetSafeHwnd() ;
    #else
       ULONG hWnd = (ULONG) mainWnd->GetSafeHwnd() ;
    #endif
    int nError = pSendMail(0, hWnd,&message, MAPI_LOGON_UI|MAPI_DIALOG, 0);
    if (nError != SUCCESS_SUCCESS &&
        nError != MAPI_USER_ABORT &&
        nError != MAPI_E_LOGIN_FAILURE) {
        AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND) ;
        Copy() ;
        }
     return TRUE ;
     }

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ


クリップボードへのテキストの転送

//  WinMFC.hxx
//*******************************************************************************
// 関数名 :クリップボードへのテキストの転送
// 作成日 :’01/07/13
// 変更日 :’07/12/14 UNICODE テキスト対応
//*******************************************************************************
inline
BOOL SetClipboardText (LPCTSTR text)
{
 CString   str = text ;
 GLOBALHANDLE hGMemText = 0 ;
 {
  hGMemText = ::GlobalAlloc(GHND,(DWORD)(str.GetLength()+1)*sizeof(TCHAR)) ;
  LPSTR  lpText = (LPSTR)::GlobalLock(hGMemText) ;
  memmove(lpText,str,str.GetLength()*sizeof(TCHAR)) ;
  ::GlobalUnlock(hGMemText) ;
  }
 {
  BOOL ret = ::OpenClipboard(NULL) ;
  if (ret == FALSE) {
   ::GlobalFree(hGMemText) ;
   ::MessageBeep(0) ;
   ::MessageBox(NULL,_T("ERROR: Cannot access the Clipboard!"),AfxGetAppName(),MB_OK|MB_ICONEXCLAMATION) ;
   return FALSE ;
   }
  else {
   ::EmptyClipboard() ;
   #ifdef _UNICODE
   ::SetClipboardData(CF_UNICODETEXT, hGMemText) ;
   #else
   ::SetClipboardData(CF_TEXT,   hGMemText) ;
   #endif
   ::CloseClipboard() ;
   }
  }
 return TRUE ;
 }
 
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

利用可能なドライブ名の列挙 GetLogicalDrives

GetLogicalDrives

//*******************************************************************************
// 関数名 :利用可能なドライブ名の列挙
// 作成日 :’10/02/02
//*******************************************************************************
CString GetLogicalDriveName (void)
{
    DWORD drives = ::GetLogicalDrives() ;
    long defaultDrive = -1 ;
    CString driveName ;
    for (int index=0 ; index<30 ; index++) {
        if (drives & (1<<index)) {
            driveName += 'A'+index ;
            }
        }
    return driveName ;
    }
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:

Disable にされたラジオボタンでアサート

Disable にされたラジオボタンで,そのボタンが選択状態(値がそのボタン)の時,DDX を使用していると Debug 版でアサートされる.
Release 版では,うまく動作する様に見える場合もあるが,他の値に変更されない場合もある.
UpdateData(FALSE) のみを使用している場合は OK.
//*******************************************************************************
// 関数名 :指定されたコントロールの無効化
// 作成日 :’09/11/11
// 変更日 :’10/01/26 ラジオボタンで選択されている時,アサートされたバグの対応
//*******************************************************************************
inline
BOOL MDlgMod::DisableControlID (CWnd* wnd,const CUIntArray& disCmmdIDs,const BOOL isDisable)
{
    BOOL isEnable = (isDisable) ? FALSE : TRUE ;
    if (wnd == NULL)   { return FALSE ;  }
    for (INT_PTR index=0 ; index<disCmmdIDs.GetSize() ; index++) {
        UINT id = disCmmdIDs[index] ;
        if (id == 0)  { continue ; }
        CWnd* ctrl = wnd->GetDlgItem(id) ;
        if (ctrl == NULL) { continue ; }
        if (!isEnable) {
            if (_AfxIsRadioButton(ctrl->GetSafeHwnd())) {     // CtlPPG.cpp
                if (Button_GetCheck(ctrl->GetSafeHwnd())) {  // WindowsX.h
                    continue ;
                    }
                }
            }
        ctrl->EnableWindow(isEnable) ;
        }
    return TRUE ;
    }
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ

  • カテゴリー:


    top

    %d人のブロガーが「いいね」をつけました。