00001
00002
00003
00004
00005 #include "MFCBase.h"
00006 #include "DxVScrollView.h"
00007
00008
00009 #ifdef _DEBUG
00010 #define new DEBUG_NEW
00011 #undef THIS_FILE
00012 static char THIS_FILE[] = __FILE__;
00013 #endif
00014
00015
00016 using namespace jbxl;
00017 using namespace jbxwl;
00018
00019
00021
00022
00023 IMPLEMENT_DYNCREATE(CDxVScrollView, CExView)
00024
00025
00026 CDxVScrollView::CDxVScrollView()
00027 {
00028 cnstXSize = true;
00029 activeWin = true;
00030
00031
00032 dispRect.top = 0;
00033 dispRect.bottom = 0;
00034 dispRect.right = 0;
00035 dispRect.left = 0;
00036
00037
00038 renderRect.top = 0;
00039 renderRect.bottom = 0;
00040 renderRect.right = 0;
00041 renderRect.left = 0;
00042
00043
00044 bufferRect.top = 0;
00045 bufferRect.bottom = 0;
00046 bufferRect.right = 0;
00047 bufferRect.left = 0;
00048
00049 maxClientYSize = 0;
00050 vSBntch = 10;
00051 }
00052
00053
00054
00055 CDxVScrollView::~CDxVScrollView()
00056 {
00057 }
00058
00059
00060
00061 BEGIN_MESSAGE_MAP(CDxVScrollView, CDxBaseView)
00062
00063 ON_WM_SIZE()
00064 ON_WM_LBUTTONDBLCLK()
00065
00066 END_MESSAGE_MAP()
00067
00068
00069
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00083
00084
00085 #ifdef _DEBUG
00086 void CDxVScrollView::AssertValid() const
00087 {
00088 CDxBaseView::AssertValid();
00089 }
00090
00091
00092
00093 void CDxVScrollView::Dump(CDumpContext& dc) const
00094 {
00095 CDxBaseView::Dump(dc);
00096 }
00097 #endif //_DEBUG
00098
00099
00100
00101
00103
00104
00105 void CDxVScrollView::OnInitialUpdate()
00106 {
00107 cmnHead = pDoc->cmnHead;
00108 if (isNull(cmnHead.grptr)) return;
00109
00110 maxClientYSize = Min(cmnHead.ysize, this->maxYSize);
00111 BOOL rslt = InitDevice(cmnHead.xsize, maxClientYSize);
00112 if (!rslt) {
00113
00114 CString mesg;
00115 mesg.LoadString(IDS_STR_FAIL_GET_DX9DEV);
00116 MessageBox(_T("CDxVScrollView::OnInitialUpdate():\n\n") + mesg);
00117 pFrame->doneErrorMessage = TRUE;
00118 return;
00119 }
00120
00121 dispRect.right = cmnHead.xsize - 1;
00122 renderRect.right = cmnHead.xsize - 1;
00123 dispRect.bottom = Min(cmnHead.ysize-1, clientRect.bottom);
00124 renderRect.bottom = dispRect.bottom;
00125
00126 vSBpos = 0;
00127 vSBmax = cmnHead.ysize - cmnHead.zsize;
00128 if (vSBmax<0) vSBmax = 0;
00129 SetScrollRange(SB_VERT, 0, vSBmax);
00130
00131
00132 bufferSize = Dx9GetBackBuffer(lpD3DDevice, &lpBackBuffer);
00133 if (bufferSize.x<0) {
00134 CString mesg;
00135 mesg.LoadString(IDS_STR_FAIL_CRT_BAKBUF);
00136 MessageBox(_T("CDxVScrollView::OnInitialUpdate():\n\n") + mesg);
00137 pFrame->doneErrorMessage = TRUE;
00138 return;
00139 }
00140
00141 origXSize = cmnHead.xsize;
00142 origYSize = cmnHead.zsize;
00143 sizeXYRate = (float)cmnHead.zsize/(float)cmnHead.xsize;
00144
00145
00146 SetWindowSize(cmnHead.xsize, cmnHead.zsize);
00147 hasViewData = TRUE;
00148
00149 Title = pDoc->preTitle + pDoc->Title + pDoc->pstTitle;
00150 this->SetTitle(Title);
00151
00152 return;
00153 }
00154
00155
00156
00157 void CDxVScrollView::ExecRender()
00158 {
00159 HRESULT hr;
00160
00161
00162 if (clientRect.bottom==0) bufferRect.bottom = 0;
00163 else bufferRect.bottom = (int)(renderRect.bottom*bufferSize.y/(float)clientRect.bottom);
00164 bufferRect.right = bufferSize.x;
00165
00166 hr = lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0);
00167 if (FAILED(hr)) {
00168 CString mesg;
00169 mesg.LoadString(IDS_STR_FAIL_CLR_WND);
00170 MessageBox(_T("CDxVScrollView::ExecRender():\n\n") + mesg);
00171 return;
00172 }
00173
00174 hr = lpD3DDevice->StretchRect(lpSurface, &renderRect, lpBackBuffer, &bufferRect, D3DTEXF_NONE);
00175 if (FAILED(hr)) {
00176 CString mesg;
00177 mesg.LoadString(IDS_STR_FAIL_TRNS_BAKBUF);
00178 MessageBox(_T("CDxVScrollView::ExecRender():\n\n") + mesg);
00179 return;
00180 }
00181
00182 hr = lpD3DDevice->Present(NULL, NULL, NULL, NULL);
00183 if (FAILED(hr)) {
00184
00185 hr = ResetDx9Device(lpD3DDevice, &d3dParam, this);
00186 if (FAILED(hr)) {
00187 CString mesg;
00188 mesg.LoadString(IDS_STR_FAIL_RESTR_DX9DEV);
00189 MessageBox(_T("CDxVScrollView::ExecRender():\n\n") + mesg);
00190 pFrame->SendMessage(WM_CLOSE);
00191
00192 }
00193 else ExecRender();
00194 }
00195 }
00196
00197
00198
00199 void CDxVScrollView::OnSize(UINT nType, int cx, int cy)
00200 {
00201 CDxBaseView::OnSize(nType, cx, cy);
00202
00203 if (pFrame!=NULL) {
00204 GetClientRect(&clientRect);
00205
00206 vSBmax = cmnHead.ysize - Min(cmnHead.ysize-1, clientRect.bottom) - 1;
00207 if (vSBmax<0) vSBmax = 0;
00208 if (vSBpos>vSBmax) vSBpos = vSBmax;
00209 SetScrollRange(SB_VERT, 0, vSBmax);
00210
00211 if (lpSurface!=NULL) DXRELEASE(lpSurface);
00212
00213 HRESULT hr;
00214 hr = lpD3DDevice->CreateOffscreenPlainSurface(cmnHead.xsize, clientRect.bottom+1, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &lpSurface, NULL);
00215 if (FAILED(hr)) return;
00216
00217 hr = SetNewSurface(vSBpos);
00218 }
00219 }
00220
00221
00222
00223 void CDxVScrollView::InitObject()
00224 {
00225 bufferSize = Dx9GetBackBuffer(lpD3DDevice, &lpBackBuffer);
00226 if (bufferSize.x<0) {
00227 CString mesg;
00228 mesg.LoadString(IDS_STR_FAIL_REGET_BAKBUF);
00229 MessageBox(_T("CDxVScrollView::InitObject():\n\n") + mesg);
00230 return;
00231 }
00232
00233 GetClientRect(&clientRect);
00234 HRESULT hr = lpD3DDevice->CreateOffscreenPlainSurface(cmnHead.xsize, clientRect.bottom+1, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &lpSurface, NULL);
00235 if (FAILED(hr)) {
00236 CString mesg;
00237 mesg.LoadString(IDS_STR_FAIL_REGET_SURFACE);
00238 MessageBox(_T("CDxVScrollView::InitObject():\n\n") + mesg);
00239 return;
00240 }
00241
00242 hasViewData = SetNewSurface(vSBpos);
00243 if (!hasViewData) {
00244 CString mesg;
00245 mesg.LoadString(IDS_STR_FAIL_RETRNS_SURFACE);
00246 MessageBox(_T("CDxVScrollView::InitObject():\n\n") + mesg);
00247 return;
00248 }
00249 return;
00250 }
00251
00252
00253
00254 BOOL CDxVScrollView::SetNewSurface(int ovsbpos)
00255 {
00256 renderRect.bottom = Min(cmnHead.ysize-1, clientRect.bottom);
00257 dispRect.bottom = renderRect.bottom + vSBpos;
00258 dispRect.top = vSBpos;
00259 uByte* ptr = (uByte*)&(CmnHeadBytePoint(cmnHead, 0, vSBpos));
00260 HRESULT hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, ptr, D3DFMT_L8, cmnHead.xsize, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00261 if (FAILED(hr)) return FALSE;
00262
00263 ScrollWindow(0, ovsbpos-vSBpos);
00264 return TRUE;
00265 }
00266
00267
00268
00269 void CDxVScrollView::OnLButtonDblClk(UINT nFlags, CPoint point)
00270 {
00271 pFrame->onLButtonDBLClick();
00272 }