// Logbook Demo #include #include // definire constante si initializare variabile #define IDM_OPEN 1 #define IDM_SAVE 2 #define IDM_EXIT 5 #define IDM_PRINT 42 #define IDM_HELP 40 #define IDM_ABOUT 41 #define ID_LIST 20 #define ID_LOG_IT 27 #define ID_SEARCH 35 #define ID_CLEAR 36 #define ID_160 30 #define ID_80 28 #define ID_40 3 #define ID_30 4 #define ID_20 25 #define ID_17 6 #define ID_15 7 #define ID_12 31 #define ID_10 8 #define ID_6 32 #define ID_2 9 #define ID_70 33 #define ID_BAND 10 #define ID_EDIT1 11 #define ID_EDIT2 12 #define ID_CALL 13 #define ID_CW 21 #define ID_SSB 22 #define ID_RTTY 23 #define ID_FM 24 #define ID_MODE 26 #define ID_SCROL 29 #define MaxQso 1000 // numarul maxim de qso-uri //variabilele in care se memoreaza caracteristicile textului static int cxChar, cyChar ; int iA=1; // fereastra edit care este activa ( 1 -> CALLSIGN ) int iKey; // starea tastei TAB sau ENTER int iScrol = 100; // pozitia de start a barei de defilare int iFrame = 25; // rata frame pentru timing int iNr=0; // primul qso int i; // variabila folosita la bucle e.t.c. int iB=80; // banda predefinita 80m TCHAR szM[5]="SSB"; // modul de lucru predefinit SSB int iR=59; // raportul RST predefinit FILE *Fisier; // se foloseste la incarcarea sau salvarea QSO-urilor TCHAR szAppName[] = TEXT ("Log Demo"); // diferite buffere pentru afisare, comparare texte, formatare texte TCHAR szBuff01[50]; TCHAR szBuff02[15]; TCHAR szBuff03[100]; TCHAR szBuff04[10]; TCHAR szBuff05[15]; TCHAR szBuff06[100]; TCHAR szBuff07[71]=TEXT(" ") TEXT(" "); TCHAR szFormat01[] = TEXT (" %03d %02d.%02d.%4d %02d:%02d ") TEXT("%15s %3d %4s %3d %10s"); TCHAR szFormat02[] = TEXT ("%02d.%02d.%4d %02d:%02d ") TEXT("%3d %4s %3d"); TCHAR szFormat03[] = TEXT("To Radio:%15s"); int xPage; // variabile necesare la tiparire int yPage; static DOCINFO di = { sizeof (DOCINFO), TEXT ("Test") }; // aici se memoreaza temporar data, ora sistemului SYSTEMTIME st; // variabile folosite pentru partea de timing LONGLONG Frequency; LONGLONG Offset; //definire structuri typedef struct { int iDay; int iMonth; int iYear; int iHour; int iMinute; TCHAR szCall[15]; TCHAR szComment[10]; int iBand; TCHAR szMode[5]; int iRST; } Qsodata; Qsodata QSO[MaxQso]; // se pot memora 1000 de QSO-uri // structuri sistem HINSTANCE hInstance; HWND hwnd, hwndEdit[5]; HMENU hMenu, hMenuPopup; HDC hdc, hdc1, hdcPrint; HANDLE hFile; MSG msg; PAINTSTRUCT ps; //declarare functii, codul propriu zis se afla la sfarsitul programului int RefreshDB ( int iNr); void ListDB (void); void Print(void); HDC GetPrinterDC(void); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int AskConfirmation (HWND hwnd) { return MessageBox (hwnd, "Parasim programul ?", szAppName, MB_YESNO | MB_ICONQUESTION); } // Intrarea in program prin apelarea functiei WinMain int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { //initializarea clasei wndclass WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName ; // inregistrarea clasei // daca au aparut ceva probleme se iasa din program if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Windows NT !"), szAppName, MB_ICONERROR); return 0; } // definirea unui meniu hMenu = CreateMenu(); hMenuPopup = CreateMenu(); //AppendMenu (hMenuPopup, MF_STRING, IDM_NEW, "&Nou"); AppendMenu (hMenuPopup, MF_STRING, IDM_OPEN, "&Incarcare date"); AppendMenu (hMenuPopup, MF_STRING, IDM_SAVE, "&Salvare date"); AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu (hMenuPopup, MF_STRING, IDM_EXIT, "&Inchidere program"); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuPopup, "Comenzi"); hMenuPopup = CreateMenu(); AppendMenu (hMenuPopup, MF_STRING, IDM_PRINT, "&Tiparire"); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuPopup, "&Imprimanta"); hMenuPopup = CreateMenu(); AppendMenu (hMenuPopup, MF_STRING, IDM_HELP, "&Informatii suplimentare"); AppendMenu (hMenuPopup, MF_STRING, IDM_ABOUT, "&Despre"); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuPopup, "&Informatii"); // deschiderea ferestrei // daca programatorul doreste anumite dimensiuni pentru fereastra // atunci se inlocuiesc cei patru parametrii predefiniti CW_USEDEFAULT // cu x, y, lungime, inaltime hwnd = CreateWindow (szAppName, TEXT ("LOG"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); //initializarea partii de timing ! LONGLONG CurCount; LONGLONG NextFrame; QueryPerformanceFrequency((LARGE_INTEGER*)&Frequency); Offset = Frequency / iFrame;//framerate QueryPerformanceCounter((LARGE_INTEGER*)&CurCount); NextFrame = CurCount + Offset; //bucla principala ( de mesaje ) while (msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage (&msg); DispatchMessage (&msg); } else { //Programul principal QueryPerformanceCounter((LARGE_INTEGER*)&CurCount); if(CurCount > NextFrame) { int iKey = GetAsyncKeyState(VK_TAB); // sa apasat tasta TAB ? if(iKey == 0xFFFF8000) { iA=2; SetFocus (hwndEdit[iA]); } // sa apasat tasta ENTER ? iKey = GetAsyncKeyState(VK_RETURN); if(iKey == 0xFFFF8000) { iNr = RefreshDB(iNr); ListDB(); } // afisarea datei, orei GetSystemTime(&st); hdc= GetDC(hwnd); SelectObject ( hdc, GetStockObject ( SYSTEM_FIXED_FONT)); TextOut ( hdc, 10, 50, szBuff01, wsprintf ( szBuff01, TEXT("%02d:%02d:%02d"), st.wHour,st.wMinute,st.wSecond)); TextOut ( hdc, 595, 135, szBuff01, wsprintf ( szBuff01, TEXT("%5s %02d.%02d.%4d"), TEXT ("DATA:"), st.wDay,st.wMonth,st.wYear)); //afisarea pozitiei butonului de defilare TextOut ( hdc, 640, 405, szBuff01, wsprintf ( szBuff01, TEXT("%3d"), iScrol)); ReleaseDC(hwnd, hdc); NextFrame = CurCount + Offset; } } } return 0 ; } // Functia fereastra LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // structuri sistem static HWND hstatic, hscrol, hrect, hwndList, hstatic1, hstatic2, hstatic3, hstatic4, hstatic5, hstatic6; static HWND hwndButton[20]; // textul pentru listing static TCHAR szLogb[] = TEXT (" NR DATA ORA INDICATIV") TEXT(" BANDA MOD RST COMENTARIU"); // analizarea mesajelor de la sistem switch (message) { case WM_CREATE: cxChar = LOWORD (GetDialogBaseUnits ()); cyChar = HIWORD (GetDialogBaseUnits ()); // desenarea butoanelor, a ferestrelor edit, listbox s.a.m.d. hwndButton[0] = CreateWindow ( TEXT("button"), "Introducem QSO-ul in log ?", WS_CHILD | WS_VISIBLE | BS_CENTER | BS_PUSHBUTTON, 15 * cxChar, 6 * cyChar, 23 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_LOG_IT, hInstance, NULL); hwndButton[18] = CreateWindow ( TEXT("button"), "CAUTA", WS_CHILD | WS_VISIBLE | BS_CENTER | BS_PUSHBUTTON, 1 * cxChar, 6 * cyChar, 10 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_SEARCH, hInstance, NULL); hwndButton[19] = CreateWindow ( TEXT("button"), "STERGE", WS_CHILD | WS_VISIBLE | BS_CENTER | BS_PUSHBUTTON, 1 * cxChar, 8 * cyChar, 10 * cxChar, 5 * cyChar / 4, hwnd, (HMENU) ID_CLEAR, hInstance, NULL); hwndButton[1] = CreateWindow ( TEXT("button"), TEXT("160"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON | WS_GROUP, 350 + cxChar, 3 * cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_160, hInstance, NULL); hwndButton[2] = CreateWindow ( TEXT("button"), TEXT("80M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 400 + cxChar, 3*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_80, hInstance, NULL); hwndButton[3] = CreateWindow ( TEXT("button"), TEXT("40M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 450 + cxChar, 3*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_40, hInstance, NULL); hwndButton[4] = CreateWindow ( TEXT("button"), TEXT("30M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 500+cxChar, 3*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_30, hInstance, NULL); hwndButton[5] = CreateWindow ( TEXT("button"), TEXT("20M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 350+cxChar, 5*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_20, hInstance, NULL); hwndButton[6] = CreateWindow ( TEXT("button"), TEXT("17M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 400+cxChar, 5*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_17, hInstance, NULL); hwndButton[7] = CreateWindow ( TEXT("button"), TEXT("15M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 450+cxChar, 5*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_15, hInstance, NULL); hwndButton[8] = CreateWindow ( TEXT("button"), TEXT("12M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 500+cxChar, 5*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_12, hInstance, NULL); hwndButton[14] = CreateWindow ( TEXT("button"), TEXT("10M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 350+cxChar, 7*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_10, hInstance, NULL); hwndButton[15] = CreateWindow ( TEXT("button"), TEXT("6M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 400+cxChar, 7*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_6, hInstance, NULL); hwndButton[16] = CreateWindow ( TEXT("button"), TEXT("2M"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 450+cxChar, 7*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_2, hInstance, NULL); hwndButton[17] = CreateWindow ( TEXT("button"), TEXT("70cm"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTORADIOBUTTON, 500+cxChar, 7*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_70, hInstance, NULL); hwndButton[9] = CreateWindow ( TEXT("button"), TEXT("BANDA"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_GROUPBOX, 342+cxChar, 2+cyChar, 27 * cxChar, 33 * cyChar / 4, hwnd, (HMENU) ID_BAND, hInstance, NULL); hwndButton[10] = CreateWindow ( TEXT("button"), TEXT("CW"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTOCHECKBOX | WS_GROUP, 600+cxChar, 3*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_CW, hInstance, NULL); hwndButton[11] = CreateWindow ( TEXT("button"), TEXT("SSB"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTOCHECKBOX, 650+cxChar, 3*cyChar, 6 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_SSB, hInstance, NULL); hwndButton[12] = CreateWindow ( TEXT("button"), TEXT("RTTY"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTOCHECKBOX, 600+cxChar, 5*cyChar, 7 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_RTTY, hInstance, NULL); hwndButton[20] = CreateWindow ( TEXT("button"), TEXT("FM"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_AUTOCHECKBOX, 658+cxChar, 5*cyChar, 5 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_RTTY, hInstance, NULL); hwndButton[13] = CreateWindow ( TEXT("button"), TEXT("MOD DE LUCRU"), WS_CHILD | WS_VISIBLE | BS_CENTER | BS_GROUPBOX, 590+cxChar, 2+cyChar, 15 * cxChar, 27 * cyChar / 4, hwnd, (HMENU) ID_MODE, hInstance, NULL); hwndEdit[1] = CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 50, 100, 25, hwnd, (HMENU) ID_EDIT1, hInstance, NULL) ; hwndEdit[2] = CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 220, 50, 100, 25, hwnd, (HMENU) ID_EDIT2, hInstance, NULL) ; hstatic = CreateWindow ("static", " INDICATIV", WS_CHILD | WS_VISIBLE, 100, 20, 100, 18, hwnd, (HMENU) ID_CALL, hInstance, NULL) ; hscrol = CreateWindow("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_VERT, 640, 295, 30, 100, hwnd, (HMENU) ID_SCROL, hInstance, NULL); SetScrollRange(hscrol, SB_CTL, 1, 255, FALSE); SetScrollPos(hscrol, SB_CTL, 120, FALSE); hwndList = CreateWindow ( TEXT ("listbox"), TEXT ("MODE:"), WS_CHILD | WS_VISIBLE | LBS_STANDARD, 600, cyChar * 12, cxChar *13 +GetSystemMetrics ( SM_CXVSCROLL), cyChar *3, hwnd, (HMENU) ID_LIST, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); SendMessage (hwndList, WM_SETREDRAW, FALSE, 0); SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) TEXT("1200")); SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) TEXT("2400")); SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) TEXT("4800")); SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) TEXT("9600")); SendMessage (hwndList, WM_SETREDRAW, TRUE, 0); return 0; // setarea actiunii pe una din ferestrele de editare case WM_SETFOCUS: SetFocus (hwndEdit[iA]); return 0; case WM_SIZE: // aici se introduc fuctiile de refresh fereasta pentru cazul // ca sa redimensionat fereastra spre ex. MoveWindow // nu este implementat return 0; case WM_PAINT: // in cazul WM_PAINT functia TextOut este incadrata intre // BeginPaint si EndPaint hdc= BeginPaint (hwnd, &ps); SelectObject (hdc, GetStockObject ( SYSTEM_FIXED_FONT)); SetBkColor(hdc, RGB(230,230,230)); TextOut (hdc, 2*cxChar, 5+cyChar, " ORA ", 7); TextOut (hdc, 230, 20,"COMENTARIU", 10); SetBkColor(hdc, RGB(50,255,255)); //TextOut (hdc, 260, 144,"LISTING", 7); TextOut (hdc, 600, 170,"VITEZA CAT:", 10); TextOut (hdc, 3, 160, szLogb, lstrlen(szLogb)); TextOut (hdc, 639, 270,"WPM:", 4); SetBkColor(hdc, RGB(255, 255, 255)); SetTextColor(hdc, RGB(255,0,0)); Print(); // desenarea unei linii MoveToEx(hdc, 3, 380, NULL); // positia de start LineTo(hdc, 571, 380); EndPaint (hwnd, &ps); return 0; case WM_DRAWITEM: // se foloseste in cazul cand butonul este definit de programator // BS_OWNERDRAW case WM_COMMAND: //analiza starii butoanelor if(SendMessage(hwndButton[10], BM_GETSTATE, 0, 0L)) { strcpy(szM,"CW"); iR=599; } if(SendMessage(hwndButton[11], BM_GETSTATE, 0, 0L)) { strcpy(szM,"SSB"); iR=59; } if(SendMessage(hwndButton[12], BM_GETSTATE, 0, 0L)) { strcpy(szM,"RTTY"); iR=599; } if(SendMessage(hwndButton[20], BM_GETSTATE, 0, 0L)) { strcpy(szM,"FM"); iR=59; } if(LOWORD(wParam) == ID_160) iB=160; if(LOWORD(wParam) == ID_80) iB=80; if(LOWORD(wParam) == ID_40) iB=40; if(LOWORD(wParam) == ID_30) iB=30; if(LOWORD(wParam) == ID_20) iB=20; if(LOWORD(wParam) == ID_17) iB=17; if(LOWORD(wParam) == ID_15) iB=15; if(LOWORD(wParam) == ID_12) iB=12; if(LOWORD(wParam) == ID_10) iB=10; if(LOWORD(wParam) == ID_6) iB=6; if(LOWORD(wParam) == ID_2) iB=2; if(LOWORD(wParam) == ID_70) iB=70; if(LOWORD(wParam) == ID_LOG_IT) { iNr = RefreshDB(iNr); ListDB(); } //rutina de cautare indicativ if(LOWORD(wParam) == ID_SEARCH) { GetWindowText ( hwndEdit[1], szBuff06,15 ); CharUpperBuff(szBuff06, 15); hdc= GetDC(hwnd); SelectObject ( hdc, GetStockObject ( SYSTEM_FIXED_FONT)); int h=400; for(i=0;i 0) { if (StartPage (hdcPrint) > 0) { GetWindowText ( hwndEdit[1], szBuff06,15 ); CharUpperBuff(szBuff06, 15); int h=2*yPage/50; TextOut(hdcPrint, 10, yPage/50, szBuff03, wsprintf (szBuff03, szFormat03, szBuff06)); for(i=0;i 0) EndDoc (hdcPrint); } } SetWindowText (hwndEdit[1], TEXT("")); DeleteDC (hdcPrint); } break; case IDM_HELP: MessageBox(hwnd, TEXT("Program demonstrativ"), szAppName, MB_OK | MB_ICONINFORMATION); break; case IDM_ABOUT: MessageBox(hwnd, "Exemplu de program de log\nYO2CMI\nBernardt Huth", szAppName, MB_OK); break; } break; return 0; // sa actionat bara de defilare ? case WM_VSCROLL: switch(LOWORD(wParam)) { case SB_PAGEDOWN: iScrol +=10; break; case SB_LINEDOWN: iScrol = min(255, iScrol+1); break; case SB_PAGEUP: iScrol -=10; break; case SB_LINEUP: iScrol =max(1, iScrol-1); break; case SB_TOP: iScrol = 1; break; case SB_BOTTOM: iScrol = 255; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: iScrol = HIWORD(wParam); break; default: break; } SetScrollPos(hscrol, SB_CTL, iScrol, TRUE); return 0; return 0; // sunteti siguri ca vreti sa parasiti programul ? case WM_CLOSE: if (IDYES == AskConfirmation(hwnd)) { DestroyWindow(hwnd); } return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc ( hwnd, message, wParam,lParam); } // functia pentru stocarea informatiilor unui QSO int RefreshDB (int iNr) { i=GetWindowTextLength ( hwndEdit[1]); if(i>=3) { GetWindowText ( hwndEdit[1], szBuff02,15 ); CharUpperBuff(szBuff02, 15); strcpy(QSO[iNr].szCall,szBuff02); // limitarea textului din campul de comentar i=GetWindowTextLength ( hwndEdit[2]); if(i<11) { GetWindowText (hwndEdit[2], szBuff04, 15); strcpy(QSO[iNr].szComment,szBuff04); } GetSystemTime(&st); QSO[iNr].iDay = st.wDay; QSO[iNr].iMonth = st.wMonth; QSO[iNr].iYear = st.wYear; QSO[iNr].iHour = st.wHour; QSO[iNr].iMinute = st.wMinute; strcpy(QSO[iNr].szMode,szM); QSO[iNr].iBand = iB; QSO[iNr].iRST = iR; // stergerea textului din ferestrele de editare SetWindowText (hwndEdit[2], TEXT("")); SetWindowText (hwndEdit[1], TEXT("")); iNr++; } SetFocus(hwndEdit[1]); // focusul pe prima fereastra de editare return iNr; // functia returneaza valoarea lui iNr } // functia de afisare logbook ( 10 linii ) void ListDB (void) { hdc= GetDC(hwnd); SelectObject ( hdc, GetStockObject ( SYSTEM_FIXED_FONT)); SetTextColor(hdc, RGB(255,0,0)); Print(); ReleaseDC(hwnd, hdc); } //listeaza 10 QSO-uri void Print(void) { if(iNr > 10) { for (i=0; i<10;i++) { TextOut ( hdc, 3+cxChar, 170+18*i+cyChar, szBuff03, wsprintf ( szBuff03, szFormat01, i+1+iNr-10, QSO[i+iNr-10].iDay, QSO[i+iNr-10].iMonth, QSO[i+iNr-10].iYear, QSO[i+iNr-10].iHour, QSO[i+iNr-10].iMinute, QSO[i+iNr-10].szCall, QSO[i+iNr-10].iBand, QSO[i+iNr-10].szMode, QSO[i+iNr-10].iRST, QSO[i+iNr-10].szComment)); } } else { for (i=0; ipPrinterName, NULL, NULL) ; free (pinfo5) ; } else // Windows NT { EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &dwNeeded, &dwReturned) ; pinfo4 = (PRINTER_INFO_4 *) malloc (dwNeeded) ; //pinfo4=(PRINTER_INFO_4 *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwNeeded); EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4, dwNeeded, &dwNeeded, &dwReturned) ; hdc1 = CreateDC (NULL, pinfo4->pPrinterName, NULL, NULL) ; free (pinfo4) ; } return hdc1; }