Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

�其気┐董�� C++Builder での開発で3点

43 views
Skip to first unread message

池本 登

unread,
Nov 26, 1997, 3:00:00 AM11/26/97
to

池本と申します。

Windows95でC++で開発をしておりますが、以下の内容が
わからず困っています。

もし、おわかりの方がいらっしゃいましたら、アドバイスをお願いし
ます。

よろしくお願いします。

1.EXEファイルのアイコン画像を、BitBtnに張り付けたいのですが
EXEからアイコン画像はどのようにすれば取れるのでしょうか。
また、BitBtnには、メモリ渡しで渡せるのでしょうか。

2.Windows95 で他のアプリを起動する方法教えて

Windows95 で、execl を使って他のアプリケーションを起動しようと
しておりますが、自分が、終了してしまいます。
起動した、アプリは動作します。
終了しても、起動した方は動作しておりません。

並列で起動したいのですが、この方法では、できないのでしょうか。
どうすればできるかアドバイスをしていただけますとありがたいです。

C++は、C++Builderを使っています。

よろしくお願いします。

void __fastcall Exec_Prog_FileName(int count)
{
AnsiString Name;
AnsiString Execute_FileName;

// レジストリにファイル名を削除
TRegistry *rg = new TRegistry;
rg->RootKey = HKEY_CURRENT_USER;
rg->OpenKey(Registory_Name, true);
Name = "Launcher" + IntToStr(count);
Execute_FileName = rg->ReadString(Name);
rg->CloseKey();
delete rg;

if (Execute_FileName != "") {
// ファイル名登録あり アプリケーション起動
execl(Execute_FileName.c_str(), Execute_FileName.c_str(), NULL);
}
}

3.Windows95 でドラッグ&ドロップの位置取得方法

ドラッグ&ドロップでファイルなどを取り込む事をしておりますが、
座標位置を知りたいと思っています。

どうすれば、よいのでしょうか。

ここで、X Y はとれるのですが、とれたデータが、とても思っている値と
違います。
何千万の値になっているのです。

もし、判る方がいらっしゃいましたら、アドバイスをお願いします。

C++は、C++Builderを使っています。

// ドラッグ&ドロップ 処理
void __fastcall TForm1::WMDropFiles(TWMDropFiles Msg)
{
int i, fmax;
char FileName[1024], str[2048];
POINT DragPosition;

//ドラッグされたファイル数の取得
fmax = DragQueryFile((HDROP)Msg.Drop,0xFFFFFFFF,NULL,1023);
//sprintf(str, "%d %d", DragPosition.x, DragPosition.y);

for (i = 0;i < fmax;i++) {
// ファイル名取り込み
DragQueryFile((HDROP)Msg.Drop, i, FileName,255);
sprintf(str, "%d %d %s", DragPosition.x, DragPosition.y, FileName);
ShowMessage(str);
}
DragFinish((HDROP)Msg.Drop);
}

よろしくお願いします。


池本@事業開発室(東京).クボタ
n-ik...@kubota.co.jp

Dairyo Gokan

unread,
Nov 26, 1997, 3:00:00 AM11/26/97
to

池本 登 wrote:
> Windows95でC++で開発をしておりますが、以下の内容が
> わからず困っています。

> 1.EXEファイルのアイコン画像を、BitBtnに張り付けたいのですが
> EXEからアイコン画像はどのようにすれば取れるのでしょうか。
> また、BitBtnには、メモリ渡しで渡せるのでしょうか。


 ファイルからアイコンを取得するには・・・、

HICON ExtractIcon(
HINSTANCE hInst, // instance handle
LPCTSTR lpszExeFileName,// filename of file with icon
UINT nIconIndex // index of icon to extract
);

あるいは

HICON ExtractAssociatedIcon(
HINSTANCE hInst, // application instance handle
LPTSTR lpIconPath, // path and filename of file for which icon is
wanted
LPWORD lpiIcon // pointer to icon index
);

といったAPIを使います。 アイコンが不要になったら、DestroyIcon(hIcon)で
破棄するのを忘れないでください。(これでハマった人より)

 「BitBtn」については、「C++ Builder」を使ったことがないので他の
方に聞いてください。


> 2.Windows95 で他のアプリを起動する方法教えて
>
> Windows95 で、execl を使って他のアプリケーションを起動しようと
> しておりますが、自分が、終了してしまいます。
> 起動した、アプリは動作します。
> 終了しても、起動した方は動作しておりません。
>
> 並列で起動したいのですが、この方法では、できないのでしょうか。
> どうすればできるかアドバイスをしていただけますとありがたいです。

 exec系関数への呼び出しが成功すると、新しいプロセスは呼び出し側の
プロセスが占有していたメモリに配置されます。 並列で実行させること
はできません。

 Cの標準関数のspawn系を使うとか、ShellExecute()とか、いろいろ
方法はあります。


> 3.Windows95 でドラッグ&ドロップの位置取得方法


>
> ここで、X Y はとれるのですが、とれたデータが、とても思っている値と
> 違います。
> 何千万の値になっているのです。
>

> // ドラッグ&ドロップ 処理
> void __fastcall TForm1::WMDropFiles(TWMDropFiles Msg)
> {
> int i, fmax;
> char FileName[1024], str[2048];
> POINT DragPosition;
>
> //ドラッグされたファイル数の取得
> fmax = DragQueryFile((HDROP)Msg.Drop,0xFFFFFFFF,NULL,1023);
> //sprintf(str, "%d %d", DragPosition.x, DragPosition.y);
>
> for (i = 0;i < fmax;i++) {
> // ファイル名取り込み
> DragQueryFile((HDROP)Msg.Drop, i, FileName,255);
> sprintf(str, "%d %d %s", DragPosition.x, DragPosition.y, FileName);
> ShowMessage(str);
> }
> DragFinish((HDROP)Msg.Drop);
> }

 POINT型の構造体「DragPosition」に一度も値が代入されていないので
正しい座標を取得できるはずがありません。 表示されているのはスタ
ック上のゴミです。

 DragQueryPoint((HDROP)Msg.Drop,&DragPosition);

で、ドラッグ&ドロップされた座標を取得しなければいけません。

+---------------------------------------------------------------------+
| From : Dairyo Gokan ( 後神 大陵 ) |
| Organization : Studio NAND Co., Ltd. ( スタジオ・ナンド有限会社 ) |
| Address : 39-6-102, Nishi-Kameari 3 Katsushika-ku Tokyo, 125 JAPAN |
| 〒125 東京都葛飾区西亀有3丁目39番6号パールホワイト102 |
| TEL:03-3838-0850 FAX:03-3838-0875 mailto:na...@can.bekkoame.or.jp |
+---------------------------------------------------------------------+

池本 登

unread,
Nov 27, 1997, 3:00:00 AM11/27/97
to

池本です。

ありがとうございます。

助かりました。


In article <347C2F...@can.bekkoame.or.jp>

Dairyo (Dairyo Gokan <na...@can.bekkoame.or.jp>) writes:> 池本 登 wrote:
> > Windows95でC++で開発をしておりますが、以下の内容が
> > わからず困っています。
> > 1.EXEファイルのアイコン画像を、BitBtnに張り付けたいのですが
> > EXEからアイコン画像はどのようにすれば取れるのでしょうか。
> > また、BitBtnには、メモリ渡しで渡せるのでしょうか。
>
>
>  ファイルからアイコンを取得するには・・・、
>
> HICON ExtractIcon(
> HINSTANCE hInst, // instance handle
> LPCTSTR lpszExeFileName,// filename of file with icon
> UINT nIconIndex // index of icon to extract
> );
>
> あるいは
>
> HICON ExtractAssociatedIcon(
> HINSTANCE hInst, // application instance handle
> LPTSTR lpIconPath, // path and filename of file for which icon is
> wanted
> LPWORD lpiIcon // pointer to icon index
> );
>
> といったAPIを使います。 アイコンが不要になったら、DestroyIcon(hIcon)で
> 破棄するのを忘れないでください。(これでハマった人より)

これは、今やっているところです。
ありがとうござます。

>
>  「BitBtn」については、「C++ Builder」を使ったことがないので他の
> 方に聞いてください。
>
>
> > 2.Windows95 で他のアプリを起動する方法教えて
> >
> > Windows95 で、execl を使って他のアプリケーションを起動しようと
> > しておりますが、自分が、終了してしまいます。
> > 起動した、アプリは動作します。
> > 終了しても、起動した方は動作しておりません。
> >
> > 並列で起動したいのですが、この方法では、できないのでしょうか。
> > どうすればできるかアドバイスをしていただけますとありがたいです。
>
>  exec系関数への呼び出しが成功すると、新しいプロセスは呼び出し側の
> プロセスが占有していたメモリに配置されます。 並列で実行させること
> はできません。
>
>  Cの標準関数のspawn系を使うとか、ShellExecute()とか、いろいろ
> 方法はあります。
>

ShellExecute 関数でできました。
C++Builderのヘルプに出ていなかったので、判りませんでした。

>
> > 3.Windows95 でドラッグ&ドロップの位置取得方法
> >
> > ここで、X Y はとれるのですが、とれたデータが、とても思っている値と
> > 違います。
> > 何千万の値になっているのです。
> >
> > // ドラッグ&ドロップ 処理
> > void __fastcall TForm1::WMDropFiles(TWMDropFiles Msg)
> > {
> > int i, fmax;
> > char FileName[1024], str[2048];
> > POINT DragPosition;
> >
> > //ドラッグされたファイル数の取得
> > fmax = DragQueryFile((HDROP)Msg.Drop,0xFFFFFFFF,NULL,1023);
> > //sprintf(str, "%d %d", DragPosition.x, DragPosition.y);
> >
> > for (i = 0;i < fmax;i++) {
> > // ファイル名取り込み
> > DragQueryFile((HDROP)Msg.Drop, i, FileName,255);
> > sprintf(str, "%d %d %s", DragPosition.x, DragPosition.y, F
ileName);
> > ShowMessage(str);
> > }
> > DragFinish((HDROP)Msg.Drop);
> > }
>
>  POINT型の構造体「DragPosition」に一度も値が代入されていないので
> 正しい座標を取得できるはずがありません。 表示されているのはスタ
> ック上のゴミです。
>
>  DragQueryPoint((HDROP)Msg.Drop,&DragPosition);
>
> で、ドラッグ&ドロップされた座標を取得しなければいけません。

そうか、あたりまえですね。
ありがとうございます。

0 new messages