★初心者にVisual C++を教えるスレ★ Part13

このエントリーをはてなブックマークに追加
902897:04/08/23 22:28
>>901
リビルドもしてみたんですけど・・・

最初からプロジェクト作り直したほうがよさそうですかね
903デフォルトの名無しさん:04/08/23 22:36
当方、ただ今Susieプラグインを使ってソフトを作っております。
MFC上で作っているのですが、デバイスコンテキストを絡めて使うとどうしてもうまくいきません。
BitbltもAPI(つまりハンドルを指定して表示させる)の方を使うとうまく行くのですが、CDC::Bitbltを使うとだめです。現在のソースは…

spi_getpicture(tmp,0,0,&pHBbkInfo,&h_bkbm,NULL,0);

pBmpInfo = (BITMAPINFO *)LocalLock(pHBbkInfo);
hBm = (LPBYTE)LocalLock(h_bkbm);


CDC* dc = GetDC();
CDC MemDC;
CBitmap MemBitmap;
CBitmap* poldBmp;
HBITMAP myDIB;

MemDC.CreateCompatibleDC(dc);

myDIB = ::CreateDIBitmap(MemDC.GetSafeHdc(),
             &pBmpInfo->bmiHeader,CBM_INIT,
             hBm,pBmpInfo,DIB_RGB_COLORS);
MemBitmap.FromHandle(myDIB);
poldBmp = MemDC.SelectObject(&MemBitmap);

dc->BitBlt(0,0,pBmpInfo->bmiHeader.biWidth,
           pBmpInfo->bmiHeader.biHeight,&MemDC,0,0,SRCCOPY);


MemDC.SelectObject(poldBmp);

こんな感じです。これでなぜうまくいかないのかがさっぱり…どなたかご指導を…
904デフォルトの名無しさん:04/08/23 23:05
>>902
作ってるのはDLLとそれを使うMFCベースダイアログアプリ?
905デフォルトの名無しさん:04/08/23 23:08
VBスレで、そんなのVBで作るのは、やめとけ
といわれたので、ちょっとVC++スレに着てみました。

ちょっと質問なんですが
例えばチャットソフトを作ったとして、Pluginみたいな感じで
お絵かき機能とか追加してみたいんだけど、やっぱ、そういうのって無謀でしょうか?

よくPluginっていうと、DLLとかで、対応ファイルが増える
とか、そういう感じだと思うんだけど、機能まるごとの追加ができたらいいな、と。
906903:04/08/23 23:09
すいません、自己解決しました。
お騒がせしましたm(__)m
907903,906:04/08/23 23:37
すいません、やはりどうしても気になるので質問させて下さい。
先ほど自己解決したとカキコしましたが、先に示したソースの問題点は

MemBitmap.FromHandle(myDIB);

でした。これを
MemBitmap.Attach(myDIB);

とすることで解決しました。
しかしなぜFromHandleでは駄目なのかが今ひとつわかりません。
MSDNを見る限りむしろFromHandleを使う方が妥当とさえ思えます。両者の違いはどのへんにあるのでしょうか?
>>905
できないことは無いけど、最初に想定した範囲のことしか
DLLにやらせられないと思う。
たとえばDLLでお絵かき機能を付けるとすると、マウスでの入力(標準的なのだとMessageか)や
絵の表示先(オーナーウィンドウのハンドル)などをDLL側に通知、またはDLL側でそれらを
取得できないといけないでしょ。

絵だけじゃなく本当にいろんなことをプラグインでできるようにするには、
DLLとのインターフェースを相当考えないといけないでしょう。
909デフォルトの名無しさん:04/08/23 23:51
VC6のウィンドウの並びで、
○□□□
○□□□
△△△△

○□□□
○□□□
○△△△
にしたいのですが、できるならやり方を教えてください。
マークは、○がワークスペース、□がコード書き場、△がエラー表示域です。
>>907
FromHandleはstaticなメンバ関数なので
MemBitmap.FromHandle(myDIB);
はMemBitmapに対する操作ではない。

FromHandleは新しい一時オブジェクトを作り、ハンドルを結び付けて返す。
一時オブジェクトに結び付けられたハンドルは自動的に解放されないので
自分で後始末する必要がある。
>>907
あと、今度解決方法を書かずに去ろうとしたら後ろの穴を犯す。
912デフォルトの名無しさん:04/08/24 00:21
>>908
なるほど、やっぱり厳しいんですね〜
どもども、ありがとうございました
>>909
それが可能かどうかは知らんが
みんなワークスペースウィンドウとかドッキングさせていつも使ってんの?
自分は、ワークスペースは非ドッキングで、右下の方に置いてる。
で、普段は常に非表示で必要な時だけ表示させて使ってるんだが。

個人的にコードが画面いっぱいに表示されてないと気に食わないんだよねぇ。
>>911
むしろ犯して欲しい。
Alt + Shift + Enter でいいじゃん
916909:04/08/24 01:38
>>913
ありがとうございます。
そういう事ができるのは知りませんでした。やってみます。

今までは、VCをフルスクリーンにしないで左側を縮めて、
空いた位置に、フォルダウィンドウの細くしたのを置いて代用していました。

>個人的にコードが画面いっぱいに表示されてないと気に食わないんだよねぇ。
自分もそうでしたが、あると、ダブルクリック一つでファイルを開けて便利で。
>>911 どうぞ。
or2
自分は最近はこんな感じに落ち着いている
ディスプレーがせまいからこれが現在ではベスト
△△△△
□□□○
□□□○
□□□○
>>917
良い尻してますね
orつ
(:D)~~~~~~|)__
922デフォルトの名無しさん:04/08/24 20:30
お邪魔します。
WAVEファイルを使って音を鳴らしたいのですが、
c:\sdk\include\dsound.h(305) : error C2146: 構文エラー : ';' が、識別子 'dwReserved1' の前に必要です。
c:\sdk\include\dsound.h(305) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。
c:\sdk\include\dsound.h(305) : error C2501: 'dwReserved1' : 識別名を宣言するのに、型が指定されていません。
c:\sdk\include\dsound.h(306) : error C2146: 構文エラー : ';' が、識別子 'dwReserved2' の前に必要です。
c:\sdk\include\dsound.h(306) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。
c:\sdk\include\dsound.h(306) : error C2501: 'dwReserved2' : 識別名を宣言するのに、型が指定されていません。
というエラーが出てしまってコンパイルできません。
dsound.h に問題があるようなんですけど、どうすればいいのか全然分かりません・・・
どなたか解決法を教えていただけませんでしょうか? どうかよろしくお願いします。
DWORD_PTRって型が何処にも宣言されてないんじゃない?
924デフォルトの名無しさん:04/08/24 20:43
どのように宣言すればよいのでしょうか?
すいません、初心者なので全然分からないんです・・・(汗
typedef DWORD* DWORD_PTR;
これの絡みかな?読んでみ?

ttp://www.doblog.com/weblog/myblog/17039/381620#381620
>>925は嫌がらせ
>>922
DSOUND.Hの前にMMREG.Hをincludeする必要があるが、読ませてる?
>>927
テヘッ
930デフォルトの名無しさん:04/08/24 20:56
返信ありがとうございます。
エラーが出た dsound.h 内に入れたのですが、なぜか反映されずに同じエラーが出てしまいます。
どの位置で宣言するのが正しいのでしょうか?
お手数かけて申し訳ないです(汗
931デフォルトの名無しさん:04/08/24 20:58
あ、違うんですね・・・(汗
>>925
見てみます。
>>926
932デフォルトの名無しさん:04/08/24 21:01
サーバーが混雑していて今見れないようです(汗
もう少ししてから見てみますね。
>>926
ちょっと調べます。
>>928
ちょっと重いだけだろ
すぐ見れる
934デフォルトの名無しさん:04/08/24 21:05
VBで作成したTest.dllというActiveXDllの、strResult=TestM(strA,strB)という関数
をVCから呼出すプログラムを作ったのですが、うまくいきません。
まだ勉強をはじめたばかりで全然ダメだと思いますが、どこが悪いのかご教授願えな
いでしょうか?
どうかお願い致します。

#include <stdio.h>
#import "test.dll" // タイプライブラリ

using namespace TestM;

int main(void)
{
_TestM_Cls *pClass1;

if(SUCCEEDED(::CoInitialize(NULL)))
{
{
_Class1Ptr pClass1(__uuidof(TestM_Cls));
935デフォルトの名無しさん:04/08/24 21:08
あああ! 正しくこれです(汗
書いてある通りにやってみます。
皆さんありがとうございました(多謝

 
938デフォルトの名無しさん:04/08/24 21:20
すみません。VC++2003の、パスの設定がうまくいきません。
ここで質問してもいいですか?
ツール→オプション→プロジェクト→VC++ ディレクトリ
940938:04/08/24 21:36
ありがとうございました
941デフォルトの名無しさん:04/08/24 22:02
すいません、先ほどお世話になった者なのですが、
「DirectX9.0cをVisualC++6.0使用してコンパイルする場合、PlatformSDKが必須」
という事なのでPlatformSDKを検索したのですが・・・
いまいちPlatformSDKとは何か、が分かりません(汗
SDKの集合体の事を指しているのでしょうか・・・?
どなたか詳しい方いらっしゃったら教えてください。お願いします。
>>941
とりあえずググってみろや
943デフォルトの名無しさん:04/08/24 22:21
検索はGoogleで一通りしたのですが、分からなかったので・・・(汗
PlatformSDKの内のどれかが必要、ということなのでしょうか・・・
もうちょっと調べてみます・・・
>>943
いいからググれって
PlatformSDKはWindowsのAPIのライブラリ集です。時々アップデート
されているので、Visual C++には収録されてないAPIもあります。
ヘッダとかdllとかたくさん付いてます。
DirectXとかMedia Playerみたいなものは独立したSDKとして公開されてます。
つまり、「DirectX9.0cをVisualC++6.0使用してコンパイルする場合、PlatformSDKが必須」
ということは、PlatformSDKに含まれているライブラリを使うからDirectXのSDKの他に
Platform SDKもインストールせよ、ということでしょう。
Platform SDKそのものは
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
から入手できます。Core SDKというのが基本的なものなので
まずはこれをインストールしましょう。
尚、インストールはIE以外のブラウザから行なうのは大変なので
IEを使って下さい。
以上の説明で間違っていたら責任は950が取ります。
つーかWAV再生したいだけならDX使わなくてもMCIデバイス関係のAPIを
使えば楽なんじゃないかね?
ネットインストールよりFull Downloadしてからの方がいいと思うよ。
948デフォルトの名無しさん:04/08/24 23:16
試しに、winプログラムをコンパイルしてみたんですが、includeファイルが
開けないんです
949デフォルトの名無しさん:04/08/24 23:21
ちなみに「システム変数」は、今こんな感じなんです。

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32
\Wbem;C:\Program Files\pcdNavi\bin;C:\Program Files\Fujitsu
\sa\dll;;C:\Program Files\Sonic\MyDVD;;C:\Program Files\WideStudio
\ws\bin;C:\Program Files\WideStudio\ruby\bin;C:\Program Files\WideStudio
\Perl\bin;;C:\Program Files\WideStudio\Python;C:\Program Files\WideStudio\gcc\bin;
c:\Borland\Bcc55\bin;c:\Borland\Bcc55\bin;c:\Borland\Bcc55\bin;D:\Program Files\Microsoft SDK
\Bin\.;D:\Program Files\Microsoft SDK\Bin\WinNT\.SET PATH=D:\Program Files\Microsoft Visual C++ Toolkit 2003
\bin;D:\Program Files\Microsoft SDK\Bin;D:\Program Files\Microsoft SDK\Bin\Win64;%PATH%
950デフォルトの名無しさん:04/08/24 23:26
設定をやりだして、まだ、完全にできないでいます
>>949
やたらと処理系を入れる前に「環境変数の設定方法」から再勉強しましょう。