Advertisement
Advertisement
| 01.31.2008 at 01:15PM PST, ID: 23127879 |
|
[x]
Attachment Details
|
||
|
[x]
The Solution Rating System
|
||
With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.
Your Input Matters If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support. Thank you! |
||
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: |
BOOL CCreateHTMLImage::CreateImage(LPCTSTR szSrcFilename, LPCTSTR szDestFilename, CSize srcSize, CSize outputSize)
{
USES_CONVERSION;
ASSERT(GetSafeHwnd());
ASSERT(IsWindow(GetSafeHwnd()));
ASSERT(szSrcFilename);
ASSERT(AfxIsValidString(szSrcFilename));
ASSERT(szDestFilename);
ASSERT(AfxIsValidString(szDestFilename));
CRect rect(CPoint(0, 0), srcSize);
// The WebBrowswer window size must be set to our srcSize
// else it won't render everything
MoveWindow(&rect);
m_pBrowserWnd.MoveWindow(&rect);
COleVariant vUrl(szSrcFilename, VT_BSTR),
vFlags(long(navNoHistory | navNoReadFromCache | navNoWriteToCache), VT_I4),
vNull(LPCTSTR(NULL), VT_BSTR);
COleSafeArray vPostData;
if (m_pBrowser->Navigate2(&vUrl, &vFlags, &vNull, &vPostData, &vNull) == S_OK)
// We have to pump messages to ensure the event handler (DocumentComplete)
// is called.
RunModalLoop();
else
return FALSE;
// We only get here when DocumentComplete has been called, which calls EndModalLoop
// and causes RunModalLoop to exit.
IHTMLDocument3* pDocument3 = NULL;
IHTMLDocument2* pDocument = NULL;
IHTMLElement2* pElement2 = NULL;
IHTMLElement* pElement = NULL;
IViewObject2* pViewObject = NULL;
IDispatch* pDispatch = NULL;
//IDispatch* pWebBrowserDisp = NULL;
HRESULT hr;
long bodyHeight;
long bodyWidth;
long rootHeight;
long rootWidth;
long height;
long width;
hr = m_pBrowser->get_Document(&pDispatch);
if (hr == S_OK) { // Need to release pDispatch
hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (void**) &pDocument);
if (hr == S_OK) { // Need to release pDocument
hr = pDocument->get_body(&pElement);
if (hr == S_OK) { // Need to release pElement
hr = pElement->QueryInterface(IID_IHTMLElement2, (void**) &pElement2);
if (hr == S_OK) { // Need to release pElement2
hr = pElement2->get_scrollHeight(&bodyHeight);
if (FAILED(hr))
return true;
hr = pElement2->get_scrollWidth(&bodyWidth);
if (FAILED(hr))
return true;
pElement2->Release();
}
pElement->Release();
}
pDocument->Release();
}
hr = pDispatch->QueryInterface(IID_IHTMLDocument3, (void**) &pDocument3);
if (hr == S_OK) { // Need to release pDocument3
hr = pDocument3->get_documentElement(&pElement);
if (hr == S_OK) { // Need to release pElement
hr = pElement->QueryInterface(IID_IHTMLElement2, (void**) &pElement2);
if (hr == S_OK) { // Need to release pElement2
hr = pElement2->get_scrollHeight(&rootHeight);
if (FAILED(hr))
return true;
hr = pElement2->get_scrollWidth(&rootWidth);
if (FAILED(hr))
return true;
pElement2->Release();
}
pElement->Release();
}
pDocument3->Release();
}
width = bodyWidth;
height = rootHeight > bodyHeight ? rootHeight : bodyHeight;
MoveWindow(0, 0, width, height, TRUE);
::MoveWindow(m_pBrowserWnd.GetSafeHwnd(), 0, 0, width, height, TRUE);
hr = m_pBrowser->QueryInterface(IID_IViewObject2, (void**) &pViewObject);
if (hr == S_OK) { // Need to release pViewObject
BITMAPINFOHEADER bih;
BITMAPINFO bi;
RGBQUAD rgbquad;
ZeroMemory(&bih, sizeof(BITMAPINFOHEADER));
ZeroMemory(&rgbquad, sizeof(RGBQUAD));
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biClrUsed = 0;
bih.biSizeImage = 0;
bih.biCompression = BI_RGB;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bi.bmiHeader = bih;
bi.bmiColors[0] = rgbquad;
CDC* dc = GetDC();
HDC hdcMain = *dc;
if (!hdcMain)
return true;
HDC hdcMem = CreateCompatibleDC(hdcMain);
if (!hdcMem)
return true;
char* bitmapData = NULL;
HBITMAP hBitmap = CreateDIBSection(hdcMain, &bi, DIB_RGB_COLORS, (void**)&bitmapData, NULL, 0);
if (!hBitmap) {
// TODO: cleanup
return true;
}
// Save original bitmap, note this is needed to be reselected to preven GDI resource leak // EL
HGDIOBJ oldHBitmap = GetCurrentObject(hdcMem, OBJ_BITMAP);
if(oldHBitmap == NULL) {
OutputDebugString("GetCurrentObj failed\n");
return true;
}
SelectObject(hdcMem, hBitmap);
RECTL rcBounds = { 0, 0, width, height };
hr = pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, hdcMain, hdcMem, &rcBounds, NULL, NULL, 0);
if (SUCCEEDED(hr)) {
CImage image;
image.Create(outputSize.cx, outputSize.cy, 24);
CImageDC imageDC(image);
::StretchBlt(imageDC, 0, 0, outputSize.cx, outputSize.cy, hdcMem, 0, 0, width, height, SRCCOPY);
//::BitBlt(imageDC, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
image.Save(szDestFilename);
}
SelectObject(hdcMem, oldHBitmap);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
//DeleteDC(hdcMain);
ReleaseDC(dc);
pViewObject->Release();
}
pDispatch->Release();
}
return true;
}
|
| Answered By: | jkr |
| Expert Since: | 09/21/1998 |
| Accepted Solutions: | 11959 |
| Computer Expertise: | Beginner |