質問編集履歴

3

MakeUnreadCountIcon内の下地となる画像読み込み箇所のソースコードを変更

2023/12/06 04:30

投稿

cosmori-man
cosmori-man

スコア2

test CHANGED
File without changes
test CHANGED
@@ -94,8 +94,9 @@
94
94
  CImage ciLoadImage;
95
95
  CImage ciBackImage;
96
96
  CDC *pDC = GetDC();
97
-    // bitmapのリソースをLoad、本来ならアイコンファイルをここでロードしたいが、実現できなかったためビットマップで代用。
97
+    CString strIconPath;
98
- ciLoadImage.LoadFromResource( AfxGetApp( )->m_hInstance, ビットマップリソーID );
98
+ strIconPath.Format( _T( "下地となるアイコンファイル" ) );
99
+ ciLoadImage.Load( strIconPath );
99
100
  ciBackImage.Create( 32, 32, 24, 0 );
100
101
  HDC hDC = ciBackImage.GetDC( );
101
102
  DrawIconEx( hDC, 0, 0, hIcon, 32, 32, 0, NULL, DI_NORMAL );

2

誤字等の修正

2023/12/06 02:57

投稿

cosmori-man
cosmori-man

スコア2

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
  元となる画像のビット数は24bitなのに、出力される画像のビット数が32bitになってしまう。
7
7
 
8
8
  ### 調査内容
9
- 以下のようにCImageクラスを利用しないパターンも実装してみましたが、出力されるファイルが不正(開けず)でアイコン変更反映されませんでした
9
+ 以下のようにCImageクラスを利用しないパターンも実装してみましたが、出力されるファイルが真っ黒描画されていない画像になってしいます
10
10
  ```C++
11
11
  void CTalkListDlg::MakeUnreadCountIcon( int nUnreadCount )
12
12
  {
@@ -21,19 +21,19 @@
21
21
 
22
22
  // 赤い円を描画
23
23
     省略
24
- Ellipse( hDC, nCircleLeft, nCircleTop, nCircleRight, nCircleBottom );
24
+ Ellipse( hMemDC, nCircleLeft, nCircleTop, nCircleRight, nCircleBottom );
25
25
  省略
26
26
  //
27
27
 
28
28
  // 未読件数を描画
29
29
  CString strUnreadCount;
30
30
  省略
31
- DrawText( hDC, strUnreadCount, strUnreadCount.GetLength( ), rcText, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
31
+ DrawText( hMemDC, strUnreadCount, strUnreadCount.GetLength( ), rcText, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
32
32
  DeleteObject( hNewFont );
33
33
  //
34
34
 
35
35
  CString strOutputFile = _T( "アイコンファイルの出力先パス" );
36
- HBITMAP hBitmap = (HBITMAP)GetCurrentObject( hDC, OBJ_BITMAP );
36
+ HBITMAP hBitmap = (HBITMAP)GetCurrentObject( hMemDC, OBJ_BITMAP );
37
37
  SaveIconFile( hBitmap, strOutputFile );
38
38
 
39
39
  DeleteObject( hIcon );

1

調査内容、試行内容とそのソースコードを追記しました。お手数おかけして申し訳ございませんが、よろしくお願いいたします。

2023/12/06 01:15

投稿

cosmori-man
cosmori-man

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,42 @@
4
4
  ### 発生している問題・エラーメッセージ
5
5
  出力した画像の画質が荒くなり、画質の荒れ具合も毎回変化して不安定。
6
6
  元となる画像のビット数は24bitなのに、出力される画像のビット数が32bitになってしまう。
7
+
8
+ ### 調査内容
9
+ 以下のようにCImageクラスを利用しないパターンも実装してみましたが、出力されるファイルが不正(開けず)でアイコンの変更も反映されませんでした。
10
+ ```C++
11
+ void CTalkListDlg::MakeUnreadCountIcon( int nUnreadCount )
12
+ {
13
+ HICON hIcon = (HICON)LoadImage( AfxGetApp( )->m_hInstance, MAKEINTRESOURCE( アイコンファイルのリソースID ), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR );
14
+
15
+ HDC hDC = ::GetDC( m_hWnd );
16
+ HDC hMemDC = CreateCompatibleDC( hDC ); // メモリデバイスコンテキスト作成
17
+ HBITMAP hBmp = CreateCompatibleBitmap( hMemDC, 32, 32 ); // サイズ指定してビットマップ作成
18
+ ::ReleaseDC( m_hWnd, hDC );
19
+ SelectObject( hMemDC, hBmp );
20
+ DrawIconEx( hMemDC, 0, 0, hIcon, 32, 32, 0, NULL, DI_NORMAL | DI_DEFAULTSIZE );
21
+
22
+ // 赤い円を描画
23
+    省略
24
+ Ellipse( hDC, nCircleLeft, nCircleTop, nCircleRight, nCircleBottom );
25
+ 省略
26
+ //
27
+
28
+ // 未読件数を描画
29
+ CString strUnreadCount;
30
+ 省略
31
+ DrawText( hDC, strUnreadCount, strUnreadCount.GetLength( ), rcText, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
32
+ DeleteObject( hNewFont );
33
+ //
34
+
35
+ CString strOutputFile = _T( "アイコンファイルの出力先パス" );
36
+ HBITMAP hBitmap = (HBITMAP)GetCurrentObject( hDC, OBJ_BITMAP );
37
+ SaveIconFile( hBitmap, strOutputFile );
38
+
39
+ DeleteObject( hIcon );
40
+ ::ReleaseDC( m_hWnd, hDC );
41
+ }
42
+ ```
7
43
 
8
44
  ### 結果
9
45
  元の画像![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-06/cc4aff2d-3b9e-4f57-ada9-7dad8dfb1705.jpeg)