934 :
932:2009/01/24(土) 00:00:01
>>933 pin_ptrについて調べてみます。
ありがとうございました。
935 :
デフォルトの名無しさん:2009/02/01(日) 15:21:56
.NETぢゃないライブラリならアプリと同梱して自動でインストールできるのに、
.NETってMSのサイトからDLして別途インストールさせないといけませんよね?
これ、自分で勝手にファイル配れるようになってればまだマシだったのに、
いろいろなバージョンをDL、インストールしないといけない現状はいかがなものかと思います。
.NETって騒ぎ始めたあともMS謹製のOfficeは.NETじゃなかったと思うんですが、
やはりうざすぎて嫌われるのを予知していたのでしょうか
配れます
勝手に.net最新版をインストールしても、他のアプリケーションに悪影響を及ぼすことは
ありませんか?
あるいは他のひとに違うバージョンとかパッチをインストールされても動作が変わったり
する恐れはありませんか?
ない
勝手に適当に選んでくれる
そうでもない。
2.0以降は大丈夫だが。
1.0-1.1以降
1.1-2.0以降
は動作は保障されない。
>>939 どうせ書くなら「まともな」日本語で頼む。
理解できないの?ハハッワロス
>>939 最新版をインストールしても古いのが使われるよ
逆に新しいので使わせたかったら、
古いのをアンインストするか、
構成ファイルでバージョン指定
<configuration><startup>
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v1.1.4322"/>
クラスライブラリ(dll)作る
プラグイン用に用意されたdllを参照してその中のクラスを継承するパターンが多い
プラグインだからと言って特別なことは何もない
mscoree.libってどこにあるん?
Windows SDKに入ってるから入れてやれば
C:\Program Files\Microsoft SDKs\Windows\{Version}\Lib あたりにあるとおも
String::Format()関数を使って文字列をlabelコンポーネントで表示しているのですが、
タブが表現できず困っています。
"\n"はちゃんと反映されて改行されるのですが、"\t"としても、sprintfのようにタブが表示されません。
どのようにすればタブが反映されるのでしょうか?
System.Windows.Forms.LabelがOS標準のLabelを使ってないせいでタブの扱いなどに互換がない。
その文字列をMessageBox.Showで表示したらタブが処理されているのが分かる。
951 :
949:2009/03/01(日) 01:55:44
>>950 そういうことでしたか。
ありがとうございました。
ビットマップのメモリリークで困っています。
pictureBoxコンポーネントをフォームに配置し、プログラム上で以下のような記述で描画しています。
// pictureBoxコンポーネントからBitmapを抽出する
Bitmap bmp = pictureBox->Image;
// 描画
bmp.SetPixel( 10, 10, Color::FromArgb( 255, 255, 255 ) );
// BitamapをpictureBoxコンポーネントにセットする
pictureBox->Image = Image::FromHbitmap( bmp.GetHbitmap() );
この処理をタイマーで定期的に行うのですが、処理を行う度に抽出したビットマップ分の
メモリが増加していき、しまいにはメモリが足りないと言われてプログラムが落ちます。
bmp.Dispose()はプライベート関数なので呼べず、Deleteも効きませんでした。
そもそも、自動変数的に宣言しているので、スコープ(タイマー処理関数内)を抜けたら
自動的に解放されるのでは、とも思います。
どのように対処すればよいでしょうか?
だいぶ誤解があるようだけどその前に
pictureBox->Image = bmp;じゃダメなのか
>>952 とりあえずコードに関する事だと、
pictureBox->Image を直接編集するように変更すればいい
次に忠告、
C++/CLIはC++と.NETの両方に精通した者が使う言語
というか、そうじゃないとまともに使えん(取り扱い注意)
>>953 bmp が Bitmap^ じゃないからそれじゃダメだ
そもそも、Bitmap^ なら再代入いらないんだが
955 :
954:2009/03/01(日) 17:50:20
以下、余談 (一応、
>>952の説明)
・bmpはスコープ抜けるときにDisposeされる
・GetHbitmap()で作ったHBITMAPは解放されない(これが直接の原因。DeleteObject() せよ)
・元のpictureBox->Imageも直ぐにはDisposeされない (delete すべし)
それ以前に自分がやってることの珍妙さを理解してるのか疑問
1. pictureBox->Image の中身を bmp にコピー
2. bmp から HBITMAP (GDI) を作成 (コピーされる)
3. 2で作成した HBITMAP (GDI) から Image (CLI) を作成 (コピーされる)
>>954 PictureBoxから直接Bitampを取り出すのってできたっけ?
まあBitmapにしないで、Graphics.FromImageを使えばいいはずだけど。
普通にキャスト(C++/CLIだとsafe_cast)すればいいと思うよ
Bitmap であることを保証するのはプログラマの仕事
(プロパティには自分で代入してるはずでしょ?)
PictureBox.ImageってBitmap^型じゃなかったか?
それをそのまま使えばいいだけじゃないのかと
あと勘違いしてるみたいだけど,C++/CLIではBitmap^とBitmapはどちらもハンドル型だよ
>>958 いやいやいや、名前通りImage^型だよ。
あと、^なしのBitmapだとスコープを抜けるときにDisposeが呼ばれるから、
単純に同じと言いきったらまずいだろ。
960 :
952:2009/03/02(月) 00:10:30
みなさん、ありがとうございます。
ちゃんと勉強してから組まないといけませんね(汗)
ありがとうございました。
>>960 とりあえず、.NET使いたい/勉強したいだけならC#に行くといい
一番重要なのは、コンパイルが早いことと、インテリセンス、スニペット使い放題なこと
962 :
945:2009/03/04(水) 22:14:29
ソース公開されてるプラグイン見れ
あとそれPASSが設定されているわけだが
panel1の中にpictureBox1を配置して
panel1.AutoScroll = true;としたのですが
スクロールバーの表示が何か変です。
初期状態ではpanel1.HorizontalScroll.Maximumや
panel1.VerticalScroll.Maximumの値が100で、
pictureBox1の位置とサイズをpanel1より大きくすると
Maximumの値がpictureBox1に合わせて広がりますが
その後pictureBox1の位置とサイズを小さくしても
Maximumの値が広がったままになっています。
その後panel1の中にpictureBox1が収まると
スクロールバーは縦横とも表示されないのですが、
横は収まってるけど縦に収まらない状況になると
本来なら縦スクバーだけ表示されるはずなのに
必要ない横スクバーまで表示されてしまいます。
panel1.HorizontalScroll.Visibleを確認するとfalseでした。
スクロールバーの稼動範囲はMaximumの値を基準に
しているようですが実際には反応しません。
Maximumの値は取得できても変更することはできなくて
ガバガバに広がっていく一方なのでスクロールバーを
締めなおすこともできません。どうしたもんでしょうか?
panel1.HorizontalScroll.LargeChangeとかは変更できるのに…
>>964 一生懸命書いてるつもりかもしれんが文章が「日本語で書きください」過ぎる。
ただ、HScrollProperties.Maximumってどういう値かわかって操作してるのか?
Valueプロパティに関心がない限り、普通は触る必要がないはずの値だと思うんだが。。
横にスクロールする必要がない状況でも
ScrollProperties.Maximumが大きいままなので
それが機能しないスクロールバーが表示される原因と
何か関係があるのではと思いました。
ScrollProperties.Maximumでスクロール可能な範囲の上限を
取得または設定しますとあるので適切な値を設定すれば
スクロールバーがバグって表示されることもないかと
panel1.HorizontalScroll.Maximum=100とかやってみても
Maximumの値は100になってくれません。
Maximumの値を自分で変更するにはどうすれば、もしくは
不要なスクロールバーを表示させないようにするには
どうすればいいのかで困っております。
スクロールバーは一度AutoScrollをfalseにして
またtrueにすれば表示されなくなりました。
中途半端ですがとりあえず自己解決です。
文字コードについての質問なんですが、
文字列に独自の文字コードを埋め込もうと思ってて
char first[3] = {0xef, 0x27, 0x00};
char second[10] = "・てすと";
char last[3] = {0xef, 0x28, 0x00};
char buforg[100];
ZeroMemory(buforg, sizeof(buforg));
strcat(buforg, first);
strcat(buforg, second);
strcat(buforg, last);
System::String^ strTest = gcnew String(buforg);
こんな感じでやって strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
0x30fb・てすと0x30fb になってしまい 「・」が0x30fbなので区別がつかない状態になってしまいます。
Stringはおろかwchar_tなどのUnicode全般でこのような現象になってる気がするのですが、
この勝手に変換されちゃう現象どうにかする方法はないでしょうか?
WindowsXP SP3 VisualStudio2008Pro C++/CLI
char second[10] = "00てすと"; // 0xfb30
second[0]=0x30, second[1]=0xfb; ではダメか?
ちなみに、ソースファイルの文字コードは何ですか?
(UTF-16(Unicode):UTF-8:S-JIS)
>>969 0x30fb 0x30 0xfa1b 0xff84 'す' 'と' 0x30fb って感じになりました。
ソースコードは日本語(S-JIS) コードページ: 932です。
Unicode(UTF-8シグネチャつき)コードページ:65001
Unicode コードページ1200
Unicode(Big Endian) コードページ1201
で試してみましたが効果ありませんでした。
CLIでもデフォ文字コードってUnicodeでなかったか?
独自コード梅たいなら徹頭徹尾BYTE[]で扱わないとダメなんでないの
どうやら外字領域の文字コードを使うとShiftJISの外字領域とUnicodeの外字領域が1対1で対応してるので
うまくいくぽいです。
なので一時的に 0xef27を外字領域の文字コードに置き換えるなどして対処してみます
ありがとうございました。
>>968 初めからwchar_t使えばいいじゃない。
wchar_t first[] = {0xef27, 0x00};
wchar_t second[] = L"・てすと";
wchar_t last[] = {0xef28, 0x00};
wchar_t buforg[100];
ZeroMemory(buforg, sizeof(buforg));
wcscat(buforg, first);
wcscat(buforg, second);
wcscat(buforg, last);
System::String^ strTest = gcnew String(buforg);
"・てすと"をwchar_tにするのがいや?
だったら、first、second、lastみんなSystem::Stringにしてから連結するのが楽だよ。
>>969-970 ソースコード自体の文字コードは、プログラムには基本的に影響しないよ。
974 :
969:2009/03/14(土) 18:46:03
>>973 その System::String にどうやって外字コードを埋め込むのかの問題。
:
0x30fb --> "・" だから、Unicode-BE でソース書かないと。ただし、Visual Studio IDEで開くと文字化けする。
char型に 0xfe が代入出来てるのも気になった。
:
テスト方法:
IO::StreamWriter^ sw = gcnew IO::StreamWriter("testCLI.txt", false, Text::Encoding::BigEndianUnicode );
sw->Write(strTest);
sw->Close();
>>974 いや、ソースコードがいかなる文字コードだろうと、
char mbs[] = "・";はchar mbs[] = {0x81, 0x45, 0x00};と同じだし(日本語環境なら)、
wchar_t wcs[] = L"・";はchar mbs[] = {0x30fb 0x0000};と同じ。
そのテスト方法のコードで確かめてみれば分かる。
charの初期化で0xfeを指定している部分は警告レベルを上げると指摘される。
'\xfe'と書けばいい。
976 :
974:2009/03/14(土) 22:16:46
>>975 そのとおりです。
> char second[10] = "・てすと";
> 「・てすと」になってしまい、「・」が0x30fbなので
初期化の時点では「・」は0x30fbでない。
もしかして、"・てすと"の「・」ってその外字だったり独自のコードだったりするの?
978 :
969:2009/03/15(日) 00:07:10
>>968 UCHAR first[3] = {0xef, 0x27, 0x00};
UCHAR second[10] = "・てすと";
UCHAR last[3] = {0xef, 0x28, 0x00};
TCHAR buforg[100];
などのように、変更する。
System::String((TCHAR*)buforg); に変えるだけでも同じ結果になる。
> strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
979 :
969:2009/03/15(日) 00:47:00
間違い。
TCHAR second[5] = L"・てすと";
> もしかして、"・てすと"の「・」ってその外字だったり独自のコードだったりするの?
違う、と思う。
>>978 TCHARってだけ書かれてもUNICODEのときの話かそうでないのか分からない。
981 :
969:2009/03/15(日) 02:07:02
あっそうだ WCHAR。
> char first[3] = {0xef, 0x27, 0x00};
> char last[3] = {0xef, 0x28, 0x00};
それと、このあたりのバイトオーダーも気になるから
UCHAR first[3] = {0x27, 0xef, 0x00};
UCHAR last[3] = {0x28, 0xef, 0x00};
> strTestには 0xef27・てすと0xef28 と入るのが理想なんですが
982 :
973:2009/03/15(日) 17:50:52
>>977 マルチバイトの0xef27と「・」(0x8145)が Stringにしたときに同じ文字コードだよってのを確認するための「・」です。
最終的にStringインスタンス生成するときにUnicodeで渡せばエンコード入らないので
独自文字コードが変化しないって感じですか。
今回は出力する直前までbyte[]で保持し続けておいて出力する段階で外字領域に一時的に変換するって形で対応しちゃったんですが
とても勉強になりました。ありがとうございました。