134a #include #include #include #include #include #include #include "gshhs.h" HINSTANCE hInst; HWND hwndStatus; int statusHeight; BOOL DrawMap(HWND hwnd, HDC hdc) { FILE *f; double w, e, s, n, area, lon, lat; char source; int i; int max_east = 270000000; struct GSHHS h; struct GSHHS_POINT p; POINT *dPoints; RECT rect; HBRUSH hBrush; HPEN hPen; double xScaleFact, yScaleFact; BOOL retVal = TRUE; if (! (f = fopen("d:/Graphics/GIS/GSHHS/gshhs_l.b", "rb"))) { MBPrintf("DrawMap", "Error opening data file"); return FALSE; } ShowStatus(hwndStatus, 0, "Processing..."); GetClientRect(hwnd, &rect); xScaleFact = (double)rect.right / 360.0; yScaleFact = (300.0 * ((double)rect.right / 600.0)) / 180.0; rect.bottom -= statusHeight; hBrush = CreateSolidBrush(0x00ffd0d0); FillRect (hdc, &rect, hBrush); DeleteObject(hBrush); hBrush = CreateSolidBrush(0x00207020); hPen = CreatePen(PS_SOLID, 0, 0x00207020); SelectObject(hdc, (HGDIOBJ)hBrush); SelectObject(hdc, (HGDIOBJ)hPen); while (fread((void *)&h, (size_t)sizeof (struct GSHHS), (size_t)1, f) == 1) { h.id = swabi4 ((unsigned int)h.id); h.n = swabi4 ((unsigned int)h.n); h.level = swabi4 ((unsigned int)h.level); h.west = swabi4 ((unsigned int)h.west); h.east = swabi4 ((unsigned int)h.east); h.south = swabi4 ((unsigned int)h.south); h.north = swabi4 ((unsigned int)h.north); h.area = swabi4 ((unsigned int)h.area); h.greenwich = swabi2 ((unsigned int)h.greenwich); h.source = swabi2 ((unsigned int)h.source); /* if (h.level != 1) { for (i = 0; i < h.n; i++) { if (fread ((void *)&p, (size_t)sizeof(struct GSHHS_POINT), (size_t)1, f) != 1) { MBPrintf("DrawMap", "Error reading file for polygon %d, point %d.\n", h.id, i); retVal = FALSE; goto end; } } continue; } */ w = h.west * 1.0e-6; e = h.east * 1.0e-6; s = h.south * 1.0e-6; n = h.north * 1.0e-6; source = (h.source == 1) ? 'W' : 'C'; area = 0.1 * h.area; dPoints = (POINT *)malloc(sizeof(POINT) * h.n); for (i = 0; i < h.n; i++) { if (fread ((void *)&p, (size_t)sizeof(struct GSHHS_POINT), (size_t)1, f) != 1) { MBPrintf("DrawMap", "Error reading file for polygon %d, point %d.\n", h.id, i); retVal = FALSE; goto end; } p.x = swabi4 ((unsigned int)p.x); p.y = swabi4 ((unsigned int)p.y); lon = (h.greenwich && p.x > max_east) ? p.x * 1.0e-6 - 360.0 : p.x * 1.0e-6; lat = p.y * 1.0e-6; dPoints[i].x = (lon * xScaleFact); dPoints[i].y = (rect.bottom / 2) - (lat * yScaleFact); } if (! Polygon(hdc, dPoints, h.n)) { MBPrintf("DrawMap", "Polygon overflow: %d points", h.n); retVal = FALSE; goto end; } free(dPoints); max_east = 180000000; } end: fclose(f); DeleteObject(hBrush); DeleteObject(hPen); ShowStatus(hwndStatus, 0, "Done"); return retVal; } LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; int x, y; BOOL r; switch (msg) { case WM_CREATE: hwndStatus = CreateStatusWnd(hInst, hwnd, 2); GetWindowRect(hwndStatus, &rect); statusHeight = rect.bottom - rect.top; x = (int)(((LPCREATESTRUCT)lParam)->x); y = (int)(((LPCREATESTRUCT)lParam)->y); MoveWindow(hwnd, x, y, 600 + (GetSystemMetrics(SM_CXSIZEFRAME) * 2), 300 + statusHeight + GetSystemMetrics(SM_CYCAPTION) + (GetSystemMetrics(SM_CYSIZEFRAME) * 2), TRUE); return 0; case WM_SIZE: SendMessage(hwndStatus, WM_SIZE, wParam, lParam); SetStatusParts(hwndStatus, 2); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); r = DrawMap(hwnd, hdc); EndPaint(hwnd, &ps); if (! r) exit(1); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,msg,wParam,lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { WNDCLASS wc; HWND hwnd; MSG msg; hInst = hInstance; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MainWndClass"; if (! RegisterClass(&wc)) return 0; hwnd = CreateWindow( "MainWndClass", "DrawMap", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 600, 375, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } . 0