ビットマップ形式でペイントしたお月様の背景に星を描画したいと考えています。月を描画せずに星だけ描画することはできるのですが、ビットマップ形式で月とその背景の宇宙空間を描画し、その上から星を描画しようとすると、月と宇宙空間は正しく描画されますが星が描画されません。星は座標データを読み込みSetPixel関数を用いて十字架の形で描画させています。ビットマップ形式での描画とただの図形(星)の描画を同じウィンドウで行うには何か書き方のポイントとかがあるのでしょうか?(星を描画する関数の呼び出すタイミングがおかしいとか)何かアドバイスがあればよろしくお願い致します。
C++
1//様々な作業の中心となるダイアログ 2BOOL CALLBACK MyDlgProc( HWND hDlg, UINT msg, WPARAM wp, LPARAM lp ) 3{ 4 char *fname; // ファイル名 5 static FILE *fp; // FILEへのポインタ 6 static FILE *fp1; 7 8 int year, month, day, hour, min, sec; //ETを秒で求めたい年, 月, 日, 時, 分, 秒(UTC) 9 10 int i; 11 double Time; 12 double Time_now; 13 double dt; 14 double theta; 15 double RA, DEC; //赤経、赤 16 double koukei, koui; //黄経、黄緯 17 18 switch(msg){ 19 case WM_INITDIALOG: 20 21 //2019年12月26日12時0分0秒(UTC)に初期設定する。 22 SetDlgItemInt(hDlg, IDC_EDIT_Y, 2019, FALSE); 23 SetDlgItemInt(hDlg, IDC_EDIT_M, 12, FALSE); 24 SetDlgItemInt(hDlg, IDC_EDIT_D, 26, FALSE); 25 SetDlgItemInt(hDlg, IDC_EDIT_H, 12, FALSE); 26 SetDlgItemInt(hDlg, IDC_EDIT_MIN, 0, FALSE); 27 SetDlgItemInt(hDlg, IDC_EDIT_S, 0, FALSE); 28 29 CheckDlgButton( hDlg, IDC_CHECK_DISPLAY1, BST_UNCHECKED); 30 31 return TRUE; 32 33 case WM_COMMAND: 34 switch(LOWORD(wp)){ 35 case IDC_BUTTON_OPEN1: // CH1のファイルを開く処理 36 if( fname = filename() ){ 37 if ( fp ) fclose ( fp ); 38 fopen_s ( &fp, fname, "r" ); 39 //read_data(hDlg, fp, 1); 40 // MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK);// ファイルをテキスト読み込みモードで開く 41 42 43 44 if (fname = filename()) { 45 if (fp1) fclose(fp1); 46 fopen_s(&fp1, fname, "r"); 47 read_star(hDlg, fp1, 1); 48 //MessageBox(NULL, "星のデータ読み込み成功", "CH1", MB_OK); 49 fclose(fp1); 50 } 51 52 if (read_data(hDlg, fp, 1)) // CH1で読み込む 53 CheckDlgButton(hDlg, IDC_CHECK_DISPLAY1, BST_CHECKED);// チェックボタンを「表示」とする 54 55 fclose( fp ); 56 InvalidateRect(hWnd, NULL, TRUE); 57 } 58 59 60 return TRUE; 61 62 case ID_OK://OKボタンが押された 63 //MessageBox(NULL ,"座標ファイル読み込み成功", "CH1", MB_OK); 64 //Time = et(year, month, day, hour, min, sec)/*GetDlgItemInt(hDlg, IDC_EDIT_ET, NULL, FALSE)*/; 65 66 year = GetDlgItemInt(hDlg, IDC_EDIT_Y, NULL, FALSE); //エディットボックスから年を読み込む 67 month = GetDlgItemInt(hDlg, IDC_EDIT_M, NULL, FALSE); //以下同様 68 day = GetDlgItemInt(hDlg, IDC_EDIT_D, NULL, FALSE); 69 hour = GetDlgItemInt(hDlg, IDC_EDIT_H, NULL, FALSE); 70 min = GetDlgItemInt(hDlg, IDC_EDIT_MIN, NULL, FALSE); 71 sec = GetDlgItemInt(hDlg, IDC_EDIT_S, NULL, FALSE); 72 73 //関数etに上記を引数として渡すと、秒で表されたElapsed Timeが戻される。 74 Time = et(year, month, day, hour, min, sec); 75 76 for(i=0; i<=total_n; i++){ 77 if(rh[i].ET > Time){ 78 g = i-1; 79 dt = Time - rh[g].ET; 80 //sprintf_s(szBuf, 256, "%d", g); 81 //MessageBox(NULL, szBuf, "超える直前のデータの番号", MB_OK); 82 break; 83 } 84 85 } 86 87 //sprintf_s(szBuf, 256, "%d %lf",g , dt); 88 //MessageBox(NULL, szBuf, "データ", MB_OK); 89 90 //sprintf_s(szBuf, 256, "%lf", haET); 91 //MessageBox(NULL, szBuf, "元データ", MB_OK); 92 93 94 95 eql.x = rh[g].VXEQL * dt + rh[g].XEQL; 96 eql.y = rh[g].VYEQL * dt + rh[g].YEQL; 97 eql.z = rh[g].VZEQL * dt + rh[g].ZEQL; 98 99 moon.x = rh[g].VXMOON * dt + rh[g].XMOON; 100 moon.y = rh[g].VYMOON * dt + rh[g].YMOON; 101 moon.z = rh[g].VZMOON * dt + rh[g].ZMOON; 102 103 sun.x = rh[g].VXSUN * dt + rh[g].XSUN; 104 sun.y = rh[g].VYSUN * dt + rh[g].YSUN; 105 sun.z = rh[g].VZSUN * dt + rh[g].ZSUN; 106 107 earth.x = 0; 108 earth.y = 0; 109 earth.z = 0; 110 111 //sprintf_s(szBuf, 256, "%lf %lf %lf %lf %lf %lf", eql.x , eql.y, eql.z, moon.x, moon.y, moon.z); 112 //MessageBox(NULL, szBuf, "eql.x, moon.x", MB_OK); 113 114 EQL_MOON = sqrtf((moon.x - eql.x)*(moon.x - eql.x) + (moon.y - eql.y)*(moon.y - eql.y) + (moon.z - eql.z)*(moon.z - eql.z)); 115 SUN_MOON = sqrtf(sun.x * sun.x + sun.y * sun.y + sun.z * sun.z); 116 EARTH_MOON = sqrtf(moon.x * moon.x + moon.y * moon.y + moon.z * moon.z); 117 118 //t = 360*3474/(2*M_PI*EQL_MOON);//視直径を計算 119 s = (3474.0*0.00005) / EQL_MOON; //月の相対的な大きさを計算 120 121 //sprintf_s(szBuf, 256, "%lf %lf", EQL_MOON, s); 122 //MessageBox(NULL, szBuf, "EQL_MOON, s", MB_OK); 123 124 for(i=0; i<=total_n2; i++){ 125 RA = 2*M_PI*(h[i].RA_h + h[i].RA_m/60 + h[i].RA_s/3600)/24; //単位を時で統一 126 DEC = 2*M_PI*(h[i].Dec_d + h[i].Dec_m/60 + h[i].Dec_s/3600)/360; //単位を度で統一 127 if (h[i].Dec_sig == FALSE) { 128 DEC = -DEC; 129 } 130 koukei = atan2(sin(M_PI*23.43 / 180)*sin(DEC)+cos(M_PI*23.43 / 180)*cos(DEC)*sin(RA),cos(DEC)*cos(RA)); //単位はrad 131 if (koukei < 0) { 132 koukei = koukei + 2 * M_PI; //単位はrad 133 } 134 koui = asin(cos(M_PI*23.43 / 180)*sin(DEC) - sin(M_PI*23.43 / 180)*cos(DEC)*sin(RA)); 135 136 star[i].x = cos(koui)*cos(koukei); 137 star[i].y = cos(koui)*sin(koukei); 138 star[i].z = sin(koui); 139 } 140 141 142 //座標変換1 143 eql = Cordi_Trans1(eql, moon); 144 moon = Cordi_Trans1(moon, moon); 145 sun = Cordi_Trans1(sun, moon); 146 earth = Cordi_Trans1(earth, moon); 147 148 149 //座標変換2 150 theta = atan2(eql.y, eql.x); 151 eql = Cordi_Trans2(eql, theta); 152 sun = Cordi_Trans2(sun, theta); 153 earth = Cordi_Trans2(eql, theta); 154 for(i=0; i<=total_n2; i++){ 155 star[i] = Cordi_Trans2(star[i], theta); 156 } 157 158 //座標変換3 159 theta = atan2(eql.x, eql.z); 160 eql = Cordi_Trans3(eql,theta); 161 sun = Cordi_Trans3(sun,theta); 162 earth = Cordi_Trans3(earth,theta); 163 for(i=0; i<=total_n2; i++){ 164 star[i] = Cordi_Trans3(star[i], theta); 165 } 166 167 //座標変換4 168 theta = atan2(-sun.x, sun.y); 169 eql = Cordi_Trans2(eql,theta); 170 sun = Cordi_Trans2(sun,theta); 171 earth = Cordi_Trans2(earth,theta); 172 for(i=0; i<=total_n2; i++){ 173 star[i] = Cordi_Trans2(star[i], theta); 174 if(star[i].z < 0){ 175 star[i].x = star[i].x * (-50 / star[i].z); 176 star[i].y = star[i].y * (-50 / star[i].z); 177 178 star[i].x = (star[i].x) / 2 * (988.5 / 10); 179 star[i].y = (star[i].y) / 2 * (741 / 10); 180 } 181 } 182 183 if(sun.y > 0){ 184 theta = atan2(-sun.x, sun.y) + M_PI; 185 eql = Cordi_Trans2(eql,theta); 186 sun = Cordi_Trans2(sun,theta); 187 earth = Cordi_Trans2(earth,theta); 188 for(i=0; i<=total_n2; i++){ 189 star[i] = Cordi_Trans2(star[i], theta); 190 if(star[i].z < 0){ 191 star[i].x = star[i].x * (-50 / star[i].z); 192 star[i].y = star[i].y * (-50 / star[i].z); 193 194 star[i].x = (star[i].x) / 2 * (988.5 / 10); 195 star[i].y = (star[i].y) / 2 * (741 / 10); 196 } 197 } 198 } 199 200 201 //sprintf_s(szBuf, 256, "%lf %lf", star[5].x, star[5].y); 202 //MessageBox(NULL, szBuf, "変換後データ", MB_OK); 203 204 205 //g = GetDlgItemInt( hDlg, IDC_EDIT_header2, &number, FALSE ); 206 InvalidateRect(hWnd_bitmap, NULL, TRUE); 207 return TRUE; 208 209 210 case IDCANCEL: //右上の×クリックで終了 211 PostQuitMessage(0); 212 DestroyWindow (hWnd); 213 214 DestroyWindow (hDlg); 215 return TRUE; 216 217 } 218 return TRUE; 219 220 } 221 return FALSE; 222}
star[i].x += (rect.right - rect.left) / 2;
star[i].y += (rect.bottom - rect.top) / 2;
と書き換えると