Пример простейшей программы для Windows


#include < windows.h >
LRESULT CALLBACK HelloWorldWndProc ( HWND, UINT, UINT, LONG );
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow )
{
HWND hWnd ;
WNDCLASS WndClass ;
MSG Msg;
char szClassName[] = "HelloWorld";
/* Регистрируем создаваемый класс */
/* Заполняем структуру типа WNDCLASS */
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = HelloWorldWndProc;
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 = NULL;
WndClass.lpszClassName = szClassName;
if(!RegisterClass(&WndClass))
{
MessageBox(NULL,"Cannot register class","Error",MB_OK);
return 0;
}
hWnd = CreateWindow(szClassName, "Program No 1",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if(!hWnd)
{
MessageBox(NULL,"Cannot create window","Error",MB_OK);
return 0;
}
/* Show our window */
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
/* Beginning of messages cycle */
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK HelloWorldWndProc (HWND hWnd, UINT Message,
UINT wParam, LONG lParam)
{
HDC hDC;
PAINTSTRUCT PaintStruct;
RECT Rect;
switch(Message)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &PaintStruct);
GetClientRect(hWnd,&Rect);
DrawText (hDC,"Hello, World!", -1, &Rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hWnd,&PaintStruct);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,Message,wParam, lParam);
}

Текст программы взят из источника:
Румянцев П.В. Азбука программирования в Win32 API. – М.: Горячая линия – Телеком, 2004. – 312 с.

Реализация операций на эллиптической кривой

Задача аутентификации документов решается с помощью использования механизма электронной цифровой подписи, который реализуется методами криптографии с открытым ключом. В основу алгоритмов цифровой подписи положены асимметричные криптографические преобразования, стойкость которых основана на сложности решения некоторой математической задачи. В последние годы широко ведутся исследования криптографических преобразований, основанных на операциях в группе точек эллиптической кривой. Арифметика эллиптических кривых, определенных над простыми и/или расширенными полями Галуа легла в основу стандартов электронной цифровой подписи многих стран, включая Украину. Это, например, такие стандарты:  ДСТУ 4145-2002, ГОСТ Р 34.10-2001, ECDSA, EC-GDSA, ECSS, EC-KCDSA.

Ниже представлена реализация в математическом пакете Maple операций сложения, удвоения точек эллиптической кривой, а также операции умножения точки кривой на число в простом поле Галуа.

Сложение точек эллиптической кривой P3=P1+P2

sum_Point:=proc(P1,P2,p)
local x1, y1, x2, y2, x3, y3, Lamda, P3:
x1:=P1[0]: y1:=P1[1]: x2:=P2[0]: y2:=P2[1]:
if (x1=0 and y1=0) then x3:=x2: y3:=y2:
else
if (x2=0 and y2=0) then x3:=x1: y3:=y1:
else
if (x1=x2 and y1=(-y2)mod p) then x3:=0: y3:=0:
else
Lamda:=((y2-y1)/(x2-x1) mod p):
x3:=(Lamda^2-x1-x2)mod p:
y3:=(Lamda*(x1-x3)-y1)mod p:
end if:
end if:
end if:
P3:=array(0..1,[x3,y3]);
end:
Читать далее →

Как поймать сообщение WM_KEYDOWN в диалоговом окне

При создании диалогового приложения в MS Visual C++ с использованием библиотеки классов MFC наткнулась на одну проблему. Решалась задача передвижения фигуры на экране с помощью клавиш управления курсором (стрелки вверх, вниз, влево, вправо). Имя проекта Move. Не могла поймать сообщение о нажатии клавиш WM_KEYDOWN, чтобы определить направление движения. Определение функций

void CMoveDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
void CMoveDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)

ничего не дало.

Сообщение WM_KEYDOWN в случае использования клавиш управления курсором обрабатывается как простая навигация по кнопкам окна.

Оказывается, WM_KEYDOWN диспетчеризуется в IsDialogMessage по логике работы диалога. Потому надо ловить его до того.

Привожу пример рабочего кода:

BOOL CMoveDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RIGHT:
AfxMessageBox("VK_RIGHT",MB_OK,NULL);
break;
case VK_LEFT:
AfxMessageBox("VK_LEFT",MB_OK,NULL);
break;
case VK_UP:
AfxMessageBox("VK_UP",MB_OK,NULL);
break;
case VK_DOWN:
AfxMessageBox("VK_DOWN",MB_OK,NULL);
break;
}
}
else CDialog::PreTranslateMessage(pMsg);
return true;
}

А ларчик просто открывался :)

Как работать с длинными числами

В вычислительной технике под длинной арифметикой понимается выполнение операций над числами, разрядность которых превышает длину машинного слова данной вычислительной машины. Частный случай — арифметика произвольной точности — относится к арифметике, в которой длина чисел ограничена только объёмом доступной памяти. Именно арифметика произвольной точности находит широкое применение в расчетах, связанных с криптографией. В языках программирования, как правило, нет встроенных средств для выполнения расчетов с произвольной точностью. Для этого необходимо использовать сторонние библиотеки, либо создавать собственные решения.

Приступая к созданию библиотеки функций для работы с длинными числами, в первую очередь следует определить, как представлять эти числа в оперативной памяти компьютера. Эта задача требует тщательно продуманного решения, поскольку впоследствии пересмотреть его будет трудно. Конечно, всегда можно внести изменения во внутреннюю структуру библиотеки программ, но пользовательский интерфейс должен оставаться настолько стабильным, насколько это возможно в смысле «совместимости снизу вверх». Читать далее →

Формы главной функции main() в С++

Сегодня мы поговорим о главной функции main() и ее формах. Традиционно, первая программа на языке программирования С++ выводит на экран строку «Hello, world!». Попробуем выполнить это несложное действие (работаем в Microsoft Visual Studio). Назовем наш проект program1.

#include <iostream>
using namespace std;
int main()
{
cout<<«Hello, world!»<<endl;
cin.get();
return 0;
} Читать далее →