mfc-ml

2000年07月

31

[mfc 25015] Re: %/%i%$%

あひるさん、いつもありがとうございます。


// 最後にDIBを得る
nRet = GetDIBits(memDC.GetSafeHdc(),//hDC,
(HBITMAP)Bitmap.GetSafeHandle(),
0L,
(DWORD)bm.bmHeight,
(LPSTR)lpbi + bi.biSize + (Size-bi.biSize - bi.biSizeImage),
lpbi,
(DWORD)DIB_RGB_COLORS);//***warning11145***

// DIBのヘッダとビット列を書き込む
if(( byteswritten = _write(fh, lpbi, Size)) == -1 ){//***11181***
AfxMessageBox( "書き込みに失敗しました。2" );
}

e:\winmap\map_src\sum200j1\map10vw.cpp(11145) : warning C4135: 2つの整数値型の間で情報が失われました。
e:\winmap\map_src\sum200j1\map10vw.cpp(11181) : warning C4135: 2つの整数値型の間で情報が失われました。

> 前にも書きましたが、これを見ると、VC1.5での型が違う気がしますね。
> 特にWriteなのですが、このサイズ情報が切り捨てられていると、書きこむ
> サイズが小さくなるので、VC1.5ではどのような宣言なのかを
> 確認すべきだと思います。
> VC1.5に対応するヘルプを確認しましたか?
いつもすみません。かなり知識不足で自信がないんですけど・・・
とりあえず上のSrcで書きこみのサイズが23272と帰ってきました。
実際にSETしているのは3955472バイトです。
あひるさんの教えてくれたように書きこみバイト数が少なかったです。
ありがとうございます。
で、その回避のためにはどうしようか考えているところです。
つまり上のwarningをどう消すかですが・・・
あひるさんのおっしゃってるのはLPBITMAPINFO lpbi が32ビットポインタかどうか
ということでしょうか?
LPBITMAPINFOは32ビットポインタです。DWORD、LPSTRも32です。
見当違いかもしれませんが・・・

また何か解ったらぜひ教えてください。
よろしくお願いします。
31

[mfc 25014] Re: %/%i%$%"%s%H2hLL$N Bitmap %U%!%$%kJ]B8$K$D$$$F

なみ 様
 こんにちは。あひる です。

        Mon, 31 Jul 2000 19:42:11 +0900 の
        [mfc 25013] Re: %/%i%$%"%s%H2hLL$N Bitmap %U%!%$%kJ]B8$K$D$$$F
        の発言に関してですが.....

》 // 最後にDIBを得る
》 nRet = GetDIBits(memDC.GetSafeHdc(),//hDC,
》 (HBITMAP)Bitmap.GetSafeHandle(),
》 0L,
》 (DWORD)bm.bmHeight,
》 (LPSTR)lpbi + bi.biSize + (Size - bi.biSize - bi.biSizeImage),
》 lpbi,
》 (DWORD)DIB_RGB_COLORS);//***warning 11144***

》 file.Write(lpbi, Size);//***warning 11172***

》e:\winmap\map_src\sum200j1\map10vw.cpp(11144) : warning C4135: 2つの整数値型の間で情報が失われました。
》e:\winmap\map_src\sum200j1\map10vw.cpp(11172) : warning C4135: 2つの整数値型の間で情報が失われました。
前にも書きましたが、これを見ると、VC1.5での型が違う気がしますね。
特にWriteなのですが、このサイズ情報が切り捨てられていると、書きこむ
サイズが小さくなるので、VC1.5ではどのような宣言なのかを
確認すべきだと思います。
VC1.5に対応するヘルプを確認しましたか?

------------------------------------------------------------
all the time with a smile
いつも笑顔で ahirugao がー >^
mailto:a...@gao.hot.co.jp
http://ahirugao.i.am/
31

[mfc 25013] Re: クライアント画面の Bitmapファイル保存について

いつもありがとうございます。

>今回のタイトル通りの事が載っていますし、サンプルファイルもあった事ぐらいしか
>覚えていません。(すいません。本当に・・・)
考えてくれるだけでもありがたいです。 ほんとに。

> まず、warning の示されている行が何の処理をやっているのか解らないので
> もう少し、詳細な情報を頂けませんか?
少し長いですが(申し訳ないです)、現状のSrcとWarningとを書きます。

#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)
BOOL C***View::SaveBitmap(char *szFileName)
{
    // ビットマップを保存する関数
    // szFileName : 保存するファイル名
CDC* pDC = NULL;
BOOL bRet = FALSE;
int nRet;
CBitmap Bitmap;
CBitmap* pOldBitmap = NULL;
CDC memDC;
CRect rcRect;
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFO lpbi;
BITMAPFILEHEADER bmH;
DWORD Size;//BITMAPINFO+ビットデータの長さ(BITMAPINFOHEADER+イメージ)
HANDLE hDIB;
CFile file;

//デバイスコンテキスト取得
pDC = GetDC();
if(pDC == NULL) return FALSE;

//クライアント画面の座標を取得
rcRect.SetRectEmpty();
GetClientRect(rcRect);
if((rcRect.IsRectEmpty() == TRUE) || (rcRect.IsRectNull() == TRUE)){
AfxMessageBox("GetClientRect Error!");
return FALSE;
}

// メモリ上に今のデバイスと互換のあるデバイスコンテキストを作ります。
if(memDC.CreateCompatibleDC(pDC) == 0){
AfxMessageBox("CreateDC Error!");  
return FALSE;
}

// メモリ上に今のデバイスと互換のあるビットマップを作成します。
if(Bitmap.CreateCompatibleBitmap(pDC,rcRect.Width(),rcRect.Height()) == 0){
AfxMessageBox("CreateBitmap Error!");
return FALSE;
}

// ビットマップを作成したデバイスコンテキストに関連付けます。
pOldBitmap = memDC.SelectObject(&Bitmap);
if(pOldBitmap == NULL){
return FALSE;
}

//メモリビットマップにコピーします。
if(memDC.BitBlt(0, 0, rcRect.Width(), rcRect.Height(), pDC, 0, 0, SRCCOPY) == 0) AfxMessageBox("BitBlt Error!");

// ビットマップ情報を取得
if(Bitmap.GetObject(sizeof(BITMAP),(LPSTR)&bm) == 0){
AfxMessageBox("GetObjct Error!");
return FALSE;
}

//8ビット以下はサポートしない
if(bm.bmPlanes * bm.bmBitsPixel <= 8){
AfxMessageBox("8ビット以下はサポートしていません。");
return FALSE;
}

// BITMAPINFOHEADERを設定
bi.biSize  = sizeof(BITMAPINFOHEADER);
bi.biWidth  = bm.bmWidth;
bi.biHeight  = bm.bmHeight;
bi.biPlanes  = 1;
bi.biBitCount  = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression  = BI_RGB;
bi.biSizeImage  = WIDTHBYTES((DWORD)bm.bmWidth * bi.biBitCount) * bm.bmHeight * 3;//****ここは*3にしないとGetDIBitsでエラーになる****
bi.biXPelsPerMeter  = 0;
bi.biYPelsPerMeter  = 0;
bi.biClrUsed  = 0;
bi.biClrImportant  = 0;

bi.biBitCount = 24;//8以下はサポートしてないので24固定

Size = sizeof(BITMAPINFOHEADER)+bi.biSizeImage;

//ビットマップイメージを保持するのに必要なメモリを確保
hDIB = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, Size);
if(hDIB == NULL){
AfxMessageBox("GlobalAlloc Error!");
}
lpbi = (LPBITMAPINFO)::GlobalLock(hDIB);
if(lpbi == NULL) AfxMessageBox("GlobalLock Error!");

// 元のビットマップをデバイスコンテキストに関連付けます。
   if(memDC.SelectObject(pOldBitmap) == 0){
   AfxMessageBox("SelectObject Error!");
return FALSE;
   }

//BITMAPINFOHEADERの情報をlpbiにコピー
lpbi->bmiHeader = bi;

// 最後にDIBを得る
nRet = GetDIBits(memDC.GetSafeHdc(),//hDC,
(HBITMAP)Bitmap.GetSafeHandle(),
0L,
(DWORD)bm.bmHeight,
(LPSTR)lpbi + bi.biSize + (Size - bi.biSize - bi.biSizeImage),
lpbi,
(DWORD)DIB_RGB_COLORS);//***warning 11144***

if(nRet == 0){
AfxMessageBox("GetDIBits2 Error!");
return FALSE;
}

// BITMAPFILEHEADERのフィールドを設定
bmH.bfType = ((WORD) ('M' << 8) | 'B'); //"BM"
bmH.bfSize = sizeof(BITMAPINFOHEADER) + Size;
bmH.bfReserved1  = 0;
bmH.bfReserved2  = 0;
bmH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

//ファイルオープン
if(!file.Open( szFileName, CFile::modeWrite|CFile::modeCreate)) AfxMessageBox("FileOpen Error!");

TRY//***warning 11167***
{
// ファイルヘッダを書き込む
file.Write(&bmH, sizeof(BITMAPFILEHEADER));
// DIBのヘッダとビット列を書き込む
file.Write(lpbi, Size);//***warning 11172***
}
CATCH(CFileException, e)
{
AfxMessageBox("FileWrite Error!");
}
END_CATCH//***warning 11178***

    ::GlobalUnlock(hDIB);
    ::GlobalFree(hDIB);
rcRect.SetRectEmpty();
   memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
Bitmap.DeleteObject();

return TRUE;
}

***********Warningです******************
初期化中...
コンパイル中...
e:\winmap\map_src\sum200j1\map10vw.cpp
e:\winmap\map_src\sum200j1\map10vw.cpp(11144) : warning C4135: 2つの整数値型の間で情報が失われました。
e:\winmap\map_src\sum200j1\map10vw.cpp(11172) : warning C4135: 2つの整数値型の間で情報が失われました。
e:\winmap\map_src\sum200j1\map10vw.cpp(11167) : warning C4762: 引数のポインタサイズ(near/far)が異なっています。実引数を仮引数の型に変換します。
e:\winmap\map_src\sum200j1\map10vw.cpp(11178) : warning C4762: 引数のポインタサイズ(near/far)が異なっています。実引数を仮引数の型に変換します。
リンク中...
リソースのバインド中...
ブラウザ データベースの作成中...
***200.EXE - エラー 0 、警告 10 
*****************************************


> #define WIDTHBYTES(i)   ((i+31)/32*4)
これについてですがSrcにも書いたのですがWIDTHBYTES*3をしないと
GetDIBitsでエラーになります。なんででしょう?
でも*3をするとあひるさんの方法で求めたのと同じ値になりエラーもでません。

> ・::GlobalAlloc()のメモリ確保サイズですが、
> BITMAPINFOHEADERのサイズ + biSizeImage + ( RGBQUADのサイズ × 256(色数) ) 分
RGBQUADがいらないのでBITMAPINFOHEADERのサイズ + biSizeImageにしました。
 
> 又、::GetDIBColorTable()のヘルプを見ると、
> このカラーマスクの考慮が必要になってくると思います。
VC++1.0にはGetDIBColorTableはないようです。
カラーマスクはまだ試してません。

> ※ 書名が解らなくなった参考書は調べておきます。
> 解ったら、又連絡します。
ちょっと行き詰まって苦しいですが頑張ります。
本当にありがとうございます。
31

[mfc 25012] TAPIでの発信者番号取得に付きまして。

 はじめまして、齋藤と申します。

 現在、TAPIにてアプリを作成しております。
通常ダイアリングのRING情報と同様に発信者番号も通知され、
TAPIにて取得できると思うのですが、解らないでおります。
どなたか、関数名でも、教えていただけると有り難いのですが。

宜しくお願い申し上げます。

齋藤 r...@asahi-net.or.jp
31

[mfc 25011] C とC++の違いについて

+--------+---------+---------+---------+---------+---------+---------+--
[mfc24793],[mfc24807],[mfc24819]でお世話になりました。伊良波です。


前回からはだいぶコードが違ってきたのですが・・・DLL呼出しで躓いています
(DLL自体は C で書かれているのですが、そいつを C++ から呼び出そうとしてい
ます。当然のことながら、DLLのソースコードはありません)

//----------------<aaa.cpp>--------------------- 

 extern "C" {
    int (CALLBACK *lpET_SEN)(unsigned char far*,
     unsigned long,
     ETSEN_STS far*,
     ETEND_STS far*);
 }
//
// 外部宣言(?)を上記のように定義しました。
// 
    lpET_ENA = (int (__stdcall *)(char *,
  ETENA_INF *,
  ETENA_STS *,
  ETEND_STS *))
 (GetProcAddress(c_hAPIDll,"ET_ENA"));

//上記のコードで、DLL内部関数のアドレスを求めます。

    nRetCode = lpET_ENA(lpszCmdParam,
&c_ZmL01EnaInf,
&c_ZmL01EnaSts,
&c_ZmL01EndSts);


//上記のコードで DLL 内部関数を実行してみたのですが、動作が期待した動作
// と違います
// どうも C 呼出しされていないようです。
// オリジナルのコード( C で書かれている)を試しにデバッグモードで
// 実行してみると、うまく DLL が呼び出されているようですが、C++ で
// 作ったコードだとうまくいきません・・・

こういう場合のコードはどのようなコードになるのでしょうか?
よろしくお願いします。(開発環境は NT4.0 SP6a + VC++6.0 です)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  伊良波 隆司     情報技術開発株式会社
                  九州支店 技術第一グループ
                  Email   t...@kyushu.tdi.co.jp
                  TEL     092-451-8218
                  FAX     092-474-7379
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
記事検索
Amazon.co.jp
  • ライブドアブログ