TNB Library
TnbBitmapBorderDrawer.h
[詳解]
1#pragma once
11#include "TnbDrawable.h"
12#include "TnbBitmapImage.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
34{
35 DEFSUPER(CNullDrawer);
36public:
37
43 {
44 m_bmps[0] = bm;
45 m_ApartBitmap();
46 }
47
53 CBitmapHandle GetParts(int idx) const
54 {
55 if ( idx >= 0 && idx < 10 )
56 {
57 return m_bmps[idx].Clone();
58 }
59 return CBitmapHandle();
60 }
61
67 virtual IDrawable* Clone(void) const
68 {
70 return P;
71 }
72
81 virtual void Draw(HDC dc, int x = 0, int y = 0) const
82 {
83 POINT po;
84 ::GetBrushOrgEx(dc, &po);
85 const SIZE& winSize = m_size;
86 SIZE sz = m_bmps[0].GetSize();
87 sz.cx /= 3;
88 sz.cy /= 3;
89 bool isNarrow = (sz.cx * 2 > m_size.cx); //狭い
90 bool isLow = (sz.cy * 2 > m_size.cy); //低い
91 RECT rc;
92 //===== 四済み
93 //-- 左上
94 ::SetRect(&rc, 0, 0, min(sz.cx, m_size.cx / 2 + 1), min(sz.cy, m_size.cy / 2 + 1));
95 if ( sz.cx == rc.right && sz.cy == rc.bottom )
96 {
97 m_bmps[7].Draw(dc, 0, 0);
98 }
99 else
100 {
101 m_bmps[7].Cut(rc).Draw(dc, 0, 0);
102 }
103 //-- 左下
104 ::SetRect(&rc, 0, 0, min(sz.cx, m_size.cx / 2 + 1), sz.cy);
105 if ( sz.cx == rc.right )
106 {
107 m_Draw(dc, m_bmps[1], 0, winSize.cy - sz.cy, winSize);
108 }
109 else
110 {
111 m_Draw(dc, m_bmps[1].Cut(rc), 0, winSize.cy - sz.cy, winSize);
112 }
113 //-- 右上
114 ::SetRect(&rc, 0, 0, sz.cx, min(sz.cy, m_size.cy / 2 + 1));
115 if ( sz.cy == rc.bottom )
116 {
117 m_Draw(dc, m_bmps[9], winSize.cx - sz.cx , 0, winSize);
118 }
119 else
120 {
121 m_Draw(dc, m_bmps[9].Cut(rc), winSize.cx - sz.cx , 0, winSize);
122 }
123 //-- 右下
124 m_Draw(dc, m_bmps[3], winSize.cx - sz.cx , winSize.cy - sz.cy, winSize);
125 //===== 辺
126 if ( ! isNarrow )
127 {
128 //-- 上辺
129 ::SetRect(&rc, sz.cx, 0, winSize.cx - sz.cx, sz.cy);
130 if ( rc.bottom > m_size.cy / 2 )
131 {
132 rc.bottom = m_size.cy / 2;
133 }
134 ::SetBrushOrgEx(dc, po.x, 0, NULL);
135 m_bmps[8].DrawTile(dc, rc);
136 //-- 下辺
137 ::SetRect(&rc, sz.cx, winSize.cy - sz.cy, winSize.cx - sz.cx, winSize.cy);
138 int t = rc.top;
139 if ( rc.top < m_size.cy / 2 )
140 {
141 rc.top = m_size.cy / 2;
142 }
143 ::SetBrushOrgEx(dc, po.x, t, NULL);
144 m_bmps[2].DrawTile(dc, rc);
145 }
146 if ( ! isLow )
147 {
148 //-- 左辺
149 ::SetRect(&rc, 0, sz.cy, sz.cx, winSize.cy - sz.cy);
150 if ( rc.right > m_size.cx / 2 )
151 {
152 rc.right = m_size.cx / 2;
153 }
154 ::SetBrushOrgEx(dc, 0, po.y, NULL);
155 m_bmps[4].DrawTile(dc, rc);
156 //-- 右辺
157 ::SetRect(&rc, winSize.cx - sz.cx, sz.cy, winSize.cx, winSize.cy - sz.cy);
158 int t = rc.left;
159 if ( rc.left < m_size.cx / 2 )
160 {
161 rc.left = m_size.cx / 2;
162 }
163 ::SetBrushOrgEx(dc, t, po.y, NULL);
164 m_bmps[6].DrawTile(dc, rc);
165 }
166 //===== 中央
167 if ( ! isNarrow && ! isLow )
168 {
169 ::SetRect(&rc, sz.cx, sz.cy, winSize.cx - sz.cx, winSize.cy - sz.cy);
170 ::SetBrushOrgEx(dc, po.x, po.y, NULL);
171 m_bmps[5].DrawTile(dc, rc);
172 }
173 }
174
175private:
177 void m_ApartBitmap(void)
178 {
179 CBitmapImage& bi = m_bmps[0];
180 SIZE sz = bi.GetSize();
181 sz.cx /= 3;
182 sz.cy /= 3;
183 RECT rc = { 0, 0, sz.cx, sz.cy };
184 m_bmps[7] = bi.Cut(rc);
185 ::OffsetRect(&rc, sz.cx, 0);
186 m_bmps[8] = bi.Cut(rc);
187 ::OffsetRect(&rc, sz.cx, 0);
188 m_bmps[9] = bi.Cut(rc);
189 ::SetRect(&rc, 0, sz.cy, sz.cx, sz.cy * 2);
190 m_bmps[4] = bi.Cut(rc);
191 ::OffsetRect(&rc, sz.cx, 0);
192 m_bmps[5] = bi.Cut(rc);
193 ::OffsetRect(&rc, sz.cx, 0);
194 m_bmps[6] = bi.Cut(rc);
195 ::SetRect(&rc, 0, sz.cy * 2, sz.cx, sz.cy * 3);
196 m_bmps[1] = bi.Cut(rc);
197 ::OffsetRect(&rc, sz.cx, 0);
198 m_bmps[2] = bi.Cut(rc);
199 ::OffsetRect(&rc, sz.cx, 0);
200 m_bmps[3] = bi.Cut(rc);
201 }
202 void m_Draw(HDC dc, const CBitmapImage& bi, int px, int py, const SIZE& size) const
203 {
204 SIZE sz = bi.GetSize();
205 RECT rc = { 0, 0, sz.cx, sz.cy };
206 bool r = false;
207 int dx = sz.cx - (size.cx / 2 + 1);
208 if ( dx > 0 )
209 {
210 rc.left += dx;
211 px += dx;
212 r = true;
213 }
214 int dy = sz.cy - (size.cy / 2 + 1);
215 if ( dy > 0 )
216 {
217 rc.top += dy;
218 py += dy;
219 r = true;
220 }
221 if ( r )
222 {
223 bi.Cut(rc).Draw(dc, px, py);
224 }
225 else
226 {
227 bi.Draw(dc, px, py);
228 }
229 }
230
231 CBitmapImage m_bmps[10];
232};
233
234
235
236}; //TNB
ビットマップイメージ管理関係のヘッダ
描画情報関係のヘッダ
ビットマップ領域描画クラス
CBitmapBorderDrawer(CBitmapHandle bm)
コンストラクタ
virtual void Draw(HDC dc, int x=0, int y=0) const
[描画] 描画.
CBitmapHandle GetParts(int idx) const
[取得] ビットマップ
virtual IDrawable * Clone(void) const
[作成] クローン作成.
HBITMAP型ハンドルハンドル
ビットマップイメージ管理クラス
bool DrawTile(HDC hdc, const RECT &rect) const
[処理] イメージタイル描画.
CBitmapImage Cut(const RECT &rect, int cx=0, int cy=0) const
[取得] イメージ取り出し.
const SIZE & GetSize(void) const
[取得] イメージサイズ取得.
bool Draw(HDC hdc, int x=0, int y=0) const
[処理] イメージ描画.
CBitmapImage Clone(void) const
[複製] クローン作成
NULL描画クラス
Definition: TnbDrawable.h:106
SIZE m_size
サイズ
Definition: TnbDrawable.h:109
TNB Library
Definition: TnbDoxyTitle.txt:2
描画情報インターフェース
Definition: TnbDrawable.h:37