Iwao Dev

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

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

2010 / 10月

GetLongPathName 存在しないと失敗

http://msdn.microsoft.com/ja-jp/library/cc429335.aspx

簡略化するために HelpAPI.hxx に以下を用意.
inline CString GetLongPathName (LPCTSTR fileName)
{
 CString longPath ;
 UINT size = _MAX_PATH ;
 DWORD len  = ::GetLongPathName(fileName,longPath.GetBuffer(size),size) ;
 longPath.ReleaseBuffer() ;
 if (len == 0) { return fileName ; }
 return longPath ;
 }

ファイルが存在しないと関数が失敗する様なので,
 ::CreateEmptyFile(sFile) ;
 CString  lFile = ::GetLongPathName(sFile) ;
 



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


DImageS の配列で,…

以下の様な DImageS の配列で,要素の表示が 1 回目しかできなかった.
 CString selFile = DImgAry.GetAt(selIndex).GetFileName() ;
 DImgAry[selIndex].Draw(&m_Image) ;

配列を直接使用するのではなく,DImageS にファイル名を取得してからでは OK .
 DImageS dImg ;
 dImg.SetFileName(selFile) ;
 dImg.Draw(&m_ImageMBA) ;
 



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


CEdit::SetSel である位置を選択

SetSel を UpdateData(FALSE) より後に呼出せば良い.
UpdateData(TRUE) ;

// 例えば文字列の最後へ
int pos = m_SelectStr.GetLength() ;
m_CtrlSelectStr.SetSel(pos,pos) ;

// UpdateData(FALSE) ;
または,UpdateData を使用しないで取得,更新する.



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

  • Categories:

画像付ファイル名のリストボックス

ヘッダファイルへの追加
 #include “DImgS.hxx” または “DImg.hxx”
 #include “ODrawDcM.hxx”

 ListBoxDocMF m_ListDImage;
 CArray <DImageS,DImageS> DImgAry ; または <DImage,…>

OnInitDialog など
 m_ListDImage.SubclassDlgItem(IDC_XXXX_FILE_LIST,this) ;
 m_ListDImage.Init() ;
 m_ListDImage.ResetContent() ;

リストに表示するファイルの設定
 DImgAry.RemoveAll() ;
 for (int dIndex=0 ; dIndex<addFiles.GetSize() ; dIndex++) {
  DImageS dImg ; または DImage
  dImg.SetFileName(addFiles[dIndex]) ;
  DImgAry.Add(dImg) ;
  }
 m_ListDImage.ResetContent() ;
 for (int rIndex=0 ; rIndex<DImgAry.GetSize() ; rIndex++) {
  CString fileName = DImgAry.GetAt(rIndex).GetFileName() ;
  m_ListDImage.AddString(fileName,fileName) ;
   // 以下は登録時に画像を付ける場合
  CString mfName = CacheFile::GetCF_Name(fileName,1000) ;
  if (::FileIsExist(mfName)) {
   m_ListDImage.SetAtDocMF(rIndex,mfName) ;
   }
  else {
   HICON icon = DImageS_GetIcon(fileName) ;
   m_ListDImage.SetAtIcon(rIndex,icon) ;
   }
  }

DImageS クラスでなく DImage クラスを使用した場合は,ImageDMF クラスをサポートする形になる.
DImageS クラスでは,対応付けた EMF での動作になる.
現状の ListBoxDocMF では Shell Extension を利用できないみたい.
別のクラスを用意するか変更が必要.間にListBoxDocSE などを用意するか?
 



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


コントロールをサブクラス化した時のエラー

ダイアログのコントロールをサブクラス化した時の実行時エラーの対応.
m_ListXxx.SubclassDlgItem(IDC_Xxxx_LIST,this) ;
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!
Program: …\Xxxx\Xxxx\Debug\Xxxx.exe
File: wincore.cpp
Line: 321
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
—————————
中止(A)   再試行(R)   無視(I)
—————————
以前 CListBox として使用していたので,変数として割り付けられていた.
変数を削除してOK.



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


FaceA::Search の高速化

データが増えると遅かったので改良
BOOL FaceA::Search(const long edgeS,const long edgeE,long* left_Face,long* rightFace) const
{
  if (left_Face == NULL) { return FALSE ; }
  if (rightFace== NULL) { return FALSE ; }
  *left_Face = *rightFace = -1 ;
  BOOL lfFound = FALSE ;
  BOOL rfFound = FALSE ;
   static long LastFace = 0 ;
  int index = 0 ;
   for (index=LastFace ; index<GetCount() ; index++) {
     Face f = Faces[index] ;
     if (!f.Search(edgeS,edgeE,&lfFound,&rfFound)) { continue ; }
     if (*left_Face<0 && lfFound) { *left_Face = index ; }
     if (*rightFace<0 && rfFound) { *rightFace = index ; }
     if (*left_Face >= 0 && *rightFace>=0) {
       LastFace = min(*left_Face,*rightFace) ;
       return TRUE ;
       }
     }
  for (index=0 ; index<GetCount() ; index++) {
    Face f = Faces[index] ;
    if (!f.Search(edgeS,edgeE,&lfFound,&rfFound)) { continue ; }
    if (*left_Face<0 && lfFound) { *left_Face = index ; }
    if (*rightFace<0 && rfFound) { *rightFace = index ; }
    if (*left_Face >= 0 && *rightFace>=0) {
      LastFace = min(*left_Face,*rightFace) ;
      return TRUE ;
      }
    }
  return FALSE ;
  }

前に検索して一致した所から再検索するコードを追加.



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


CArray の要素のコピー

FaceA::FaceA (const FaceA& other)
{

// ループによるコピー
  Faces.SetSize(other.Faces.GetSize()) ;
  for (int index=0 ; index<other.Faces.GetSize() ; index++) {
    Faces[index] = other.Faces[index] ;
    }

// CArray::Copy
  Faces.Copy(other.Faces) ;

  }

VC 6 リリース版では体感できなかったが,少なくともデバッグ版では Copy の方がはるかに速かった.



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


CImage::Draw 部分のメモ

//  AtlImage.h より

inline BOOL CImage::Draw(
  _In_ HDC hDestDC,
  _In_ int xDest,
  _In_ int yDest,
  …
{
  …
#if WINVER >= 0x0500
  if( ((m_iTransparentColor != -1) || (m_clrTransparentColor != (COLORREF)-1)) && IsTransparencySupported() ) {
    bResult = ::TransparentBlt( hDestDC, xDest, yDest, … , GetTransparentRGB() ) ;
    }
  else if( m_bHasAlphaChannel && IsTransparencySupported() ) {
    BLENDFUNCTION bf;
    bf.BlendOp = AC_SRC_OVER;
    bf.BlendFlags = 0;
    bf.SourceConstantAlpha = 0xff;
    bf.AlphaFormat = AC_SRC_ALPHA;
    bResult = ::AlphaBlend( hDestDC, xDest, yDest, … , bf) ;
    }
  else
#endif // WINVER >= 0x0500
  {
    bResult = ::StretchBlt( hDestDC, xDest, yDest, … , SRCCOPY) ;
    }
  …
  return( bResult );
  }



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



    top

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