mfc-ml

2005年11月

30

[mfc 51780] Re: ビルド時のワーニングについて

Yukiさま。

> 今問題になっているのは SIZE の cx/cy ではなくて strlen です。
> 警告メッセージには SIZE では無く size_t と書かれていますよね?

問題点を理解していなかったようです。
strlen を見落としていました。
ご指摘ありがとうございます。


渋木さま。

キャスティングの表現ですが、現在進行形というよりは名詞的用法だと思います。
勉強していた頃に教わった言葉がキャスティングだったために使用しました。
伝わりにくい表現と言うことですよね?
今後は「キャスト」という表現を用いていきたいと思います。
ご指摘ありがとうございます。

お力添え、ありがとうございました。
30

[mfc 51779] RE: ビルド時のワーニングについて

 渋木です。

 直接の回答ではありませんが。。。

> 以下のような使い方をしたかったために、キャスティングしてやる必要がありまし
た。

 なぜ現在進行形?>キャスティング

 普通は単に「キャスト」って言いませんか?

--
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
30

[mfc 51778] BitBltで転送先座標が大きい場合の問題

はじめまして。鈴木と申します。

現在VC6(SP6)でCScrollViewを用いたアプリを作成しています。

OnDraw()にて、クライアントウィンドウサイズのコンパチブルビット
マップに描画を行い、CDC::BitBlt()でViewに転送する方法を用いて
いるのですが、転送先のY座標が1億3千万を少し超えた辺りで、
転送が行われなくなります。BitBlt()はTRUEを返しているのですが。
正しく転送を行うにはどうすれば良いのでしょうか?
BitBlt()を使わず、直接描画を行った場合は問題無いようです。

開発環境は WINDOWS XP(SP2) VC6(SP6) です。
以下ソースです。問題確認用のサンプルなのでチラツキ等は無視
してください。

void CTestView::OnInitialUpdate()
{
  CScrollView::OnInitialUpdate();
  CSize sizeTotal;
  sizeTotal.cx = sizeTotal.cy = 100;
  sizeTotal.cy = INT_MAX; // ※ Viewの縦幅をINT_MAXに
  SetScrollSizes(MM_TEXT, sizeTotal);
}

void CTestView::OnDraw(CDC* pDC)
{
  CRect rect; GetClientRect(rect); // client window size
  CPoint pos = GetScrollPosition(); // scroll position
  CString text; text.Format("%d : %d", pos.x, pos.y);

  CDC memDC;
  if(memDC.CreateCompatibleDC(pDC))
  {
    CBitmap  bitmap;
    int width = rect.Width() ;
    int height = rect.Height() ;
    if( bitmap.CreateCompatibleBitmap( pDC, width, height) )
    {
      CBitmap *backup = (CBitmap *)memDC.SelectObject( bitmap );
      memDC.DrawText( "転送" + text, rect,
                 DT_CENTER | DT_VCENTER | DT_SINGLELINE );
      // 問題の転送
      pDC->BitBlt(pos.x, pos.y, width, height, &memDC, 0, 0, SRCCOPY);
      memDC.SelectObject( backup );
    }
  }
  // 通常描画(こっちは問題なし)
  pDC->DrawText( "直接"+text, pos+rect,
                          DT_CENTER | DT_BOTTOM | DT_SINGLELINE);
}

BOOL CTestView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{ // CScrollView Bug Fix
  SCROLLINFO si;
  si.cbSize = sizeof(SCROLLINFO);
  si.fMask = SIF_TRACKPOS;
  if( LOBYTE(nScrollCode) == SB_THUMBTRACK )
  {
    GetScrollInfo( SB_HORZ, &si );
    nPos = si.nTrackPos;
  }
  if( HIBYTE(nScrollCode) == SB_THUMBTRACK )
  {
    GetScrollInfo( SB_VERT, &si );
    nPos = si.nTrackPos;
  }
  return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}
-- 以上

--------------------------------------
STOP HIV/AIDS.
Yahoo! JAPAN Redribbon Campaign 2005
http://pr.mail.yahoo.co.jp/redribbon/
30

[mfc 51777] Re: ビルド時のワーニングについて

こんにちは、Yuki です。

>   myDC.TextOut( LeftOffset - ( textSize.cx >> 2 ) - ( textSize.cx * 
> strlen( strBuf ) ),
>       BottomOffset - (unsigned int)( VerticalRange * j ) - ( textSize.cy 
>  >> 1 ), strBufC );

> textSize.cx は long型ですよね?


・・・予想通りですね(^^;

今問題になっているのは SIZE の cx/cy ではなくて strlen です。
警告メッセージには SIZE では無く size_t と書かれていますよね?
30

[mfc 51776] Re: ビルド時のワーニングについて

ご回答ありがとうございます。

以下のような使い方をしたかったために、キャスティングしてやる必要がありました。

   myDC.TextOut( LeftOffset - ( textSize.cx >> 2 ) - ( textSize.cx * strlen( strBuf ) ),
       BottomOffset - (unsigned int)( VerticalRange * j ) - ( textSize.cy >> 1 ), strBufC );

textSize.cx は long型ですよね?
それを int型 に変換すると確かに上位は
削られてしまいますが、影響がないことは確認しています。

明示的にキャスティングというのは、
(int)textSize.cx 
ということで、よろしいでしょうか?

とっちゃんさんのご指摘の通り、 /Wp64 をはずす方法でワーニングが
出なくなったことを確認しました。

ありがとうございました。
記事検索
Amazon.co.jp
  • ライブドアブログ