No.1ベストアンサー
- 回答日時:
こんばんは。
アイコンを取り込んで容易にテクスチャ化する事は無理な様です。ピクセルを複写していく原始的なやり方が必要です。
LoadImage()でアイコンを読み込んで、そのイメージデータに基づいてテクスチャに書き込んでいきます。
アイコンがマスクイメージも所有している場合は、マスクデータに基づいて、テクスチャのアルファチャンネルへ書き込まないといけません。、
口で説明しきれる程、短絡的な事では無いので、取り合えず以下参考に。
struct CIcon2Texture
{
enum { COLOR = 0, MASK = 1, TOTAL = 3 };
LPDIRECT3DTEXTURE9 CreateTextureFromIcon(LPDIRECT3DDEVICE9 pDevice, LPCSTR pszName/*アイコンファイル名*/)
{
//アイコンのロード
HICON hIcon = static_cast<HICON>(::LoadImage(::GetModuleHandle(NULL), pszName, IMAGE_ICON, 0, 0, LR_LOADFROMFILE));
LPDIRECT3DTEXTURE9 pd3dtex9 = this->CreateTextureFromIcon(pDevice, hIcon);
::DeleteObject(hIcon);
return pd3dtex9;
}
LPDIRECT3DTEXTURE9 CreateTextureFromIcon(LPDIRECT3DDEVICE9 pDevice, HICON hIcon/*アイコンハンドル*/)
{
//アイコンのデータを記録する
this->GetObject(hIcon);
LPDIRECT3DTEXTURE9 pTexture = 0;
LPDIRECT3DSURFACE9 pSurface = 0;
//アルファチャンネル付き32ビットテクスチャの作成
::D3DXCreateTexture(pDevice, bmp[COLOR].bmWidth, bmp[COLOR].bmHeight, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture);
if(!pTexture)
return 0;
pTexture->GetSurfaceLevel(0, &pSurface);
if(!pSurface)
return 0;
this->PixelCopy(pSurface);
return pTexture;
}
private:
//アイコンリソースに基づいて、テクスチャサーフェースにピクセルをセットする
void PixelCopy(LPDIRECT3DSURFACE9 pSurface)
{
D3DLOCKED_RECT rc;
//サーフェースをロックする
pSurface->LockRect(&rc, NULL, 0);
//アイコンイメージ用のHDCを作成する
HDC hDCIcon = ::CreateCompatibleDC(NULL);
//逆転しているので高さの最大からスタートする
for(int y = bmp[COLOR].bmHeight - 1; y >= 0 ; --y)
{
for(int x = 0; x < bmp[COLOR].bmWidth; ++x)
{
//32ビット前提でアクセスするポジションを計算する
const int pos = (rc.Pitch * y) + (x * 4);
LPDWORD pdw = reinterpret_cast<LPDWORD>
(
static_cast<LPBYTE>(rc.pBits) + pos
);
//アイコンイメージを選択
::SelectObject(hDCIcon, ici.hbmColor);
//色彩をサーフェースに書き込む
*pdw = ::GetPixel(hDCIcon, x, y);
//マスクイメージが無ければ引き返す
if(!ici.hbmMask)continue;
//マスクイメージを選択
::SelectObject(hDCIcon, ici.hbmMask);
//マスク値をサーフェースに書き込む
*pdw |= ::GetPixel(hDCIcon, x, y) == 0 ? 0x0 : 0xff;
}
}
//開放
pSurface->UnlockRect();
::DeleteDC(hDCIcon);
}
void GetObject(HICON hIcon)
{
::GetIconInfo(hIcon, &ici);
::GetObject(ici.hbmColor, sizeof(BITMAP), &bmp[COLOR]);
::GetObject(ici.hbmMask, sizeof(BITMAP), &bmp[MASK]);
}
ICONINFOici;
BITMAPbmp[TOTAL];
};
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Web・クリエイティブ 【 3DCGソフト⠀MAYAについての質問 】 MAYAでビューからイメージプレーンを読み込むと、ビ 1 2023/07/09 02:50
- 電子書籍 電子書籍の開き方教えて 2 2022/04/30 07:04
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- ホームページ作成・プログラミング ホームページ作成について。「ワードプレスではありません」。 3 2023/08/13 14:44
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- Visual Basic(VBA) エクセルVBAでメールの自動作成の モジュールを作ったのですが、txtファイルから読み込んだ本文が文 2 2022/07/20 15:01
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マスクをとるとオーバーフロー...
-
OpenGLのグラデーションについて
-
アセンブリ言語のcasl2について...
-
VBAで改行の入ったデータの正規...
-
テキストボックスの中身をリセ...
-
変数に256文字以上のテキストを...
-
VBSでMid関数を使ったらエラー...
-
別のアプリケーションのテキス...
-
Motifのイベントの制御について...
-
'2465'指定した式で参照してい...
-
C言語でのマウスを移動とマウス...
-
レーダーチャートの描画
-
[VBS] 自分自身が改竄されてい...
-
ZWCAD CUIXとLISPの関係について
-
五芒星は、悪魔崇拝とどういう...
-
UWSCのBTN関数について。
-
四乗根を英語で言うと・・・
-
VBAからPDFのテキストフィールド
-
FLASHで画面の最大化と100%表示...
-
VB6.0 でメニューを作りたいん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
OpenGLのグラデーションについて
-
マスクをとるとオーバーフロー...
-
DirectXでのicoファイル読み込み
-
CSSアニメーションの文字について
-
切り抜いた部分が動くアニメー...
-
アセンブリ言語のcasl2について...
-
C言語でネットワーク範囲のIPア...
-
illustrator→FLASHでグラデーシ...
-
Simulinkのサブシステムの完全...
-
Flash CS4で文字全体にグラデー...
-
photoshopで書いた四角の枠の中...
-
VBAで改行の入ったデータの正規...
-
VBScriptでMsgBoxのYesNoボック...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
テキストボックスにセルの値を...
-
else if文の順序を変えることに...
-
別のアプリケーションのテキス...
-
変数に256文字以上のテキストを...
-
VB6.0で、フォームから、別のフ...
おすすめ情報