python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?
搞事開始。
首先,我們先進行如下聲明
#include #include #include #include HDC offscreen;
long double param;
COLORREF C_TRANSPARENT=RGB(1,2,3);
COLORREF C_RED=RGB(255,0,0);
這里并沒有什么值得注意的地方。
offscreen是我們繪制心形的一個小的“畫布”;而param則是繪制心形所用到的參數。
接下來,既然需要顯示一個心,那么,我們需要一個繪制心形的“畫布”。
因此,我們需要準備一個窗體。
HWND InitWindow(){
RECT rect;
HWND desktop=GetDesktopWindow();
GetWindowRect(desktop,&rect);
int width=rect.right-rect.left;
int height=rect.bottom-rect.top;
int mysize=(width
WNDCLASSEXW wndclass = { 0 };
wndclass.cbSize=sizeof(WNDCLASSEXW);
wndclass.lpfnWndProc = (WNDPROC)DefWindowProc;
wndclass.hInstance = GetModuleHandle(NULL);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.lpszClassName = L"Heart";
if (RegisterClassExW(&wndclass) == NULL)
return NULL;
HWND hWnd = CreateWindowExW(
WS_EX_LAYERED|WS_EX_TOPMOST|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW,
L"Heart", L"title",
WS_POPUP|WS_VISIBLE,
width/2-mysize/2,height/2-mysize/2,mysize,mysize,
NULL, NULL, GetModuleHandle(NULL), NULL
);
if (!hWnd)
return NULL;
SetLayeredWindowAttributes(hWnd,C_TRANSPARENT,200,LWA_ALPHA | LWA_COLORKEY);
return hWnd;
}
這里,我們將C_TRANSPARENT指定為“透明色”。這也是為了后期的效果。
再接下來,我們編寫在窗體上繪制心形的函數。這一部分是簡單的,因為只是把offscreen上的圖形復制到窗體上。甚至可以直接從隨便什么地方抄到。
void ShowImage(HWND hWnd,HDC offscreen){
RECT rect;
GetWindowRect(hWnd,&rect);
HDC dc=GetWindowDC(hWnd);
BitBlt(dc,0,0,rect.right-rect.left,rect.bottom-rect.top,offscreen,0,0,SRCCOPY);
}
然后,為整個窗體編寫事件循環。
void RunWindow(HWND hWnd){
MSG msg;
while (1) {
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)
{
if (GetMessage(&msg, NULL, 0, 0))
{
if(msg.message==WM_PAINT){
ShowImage(msg.hwnd,offscreen);
continue;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
return;
}
}
if (!IsWindow(hWnd))break;
Sleep(50);
}
}
好了,廢話說完,接下來我們進入正題,即心形的構造。
首先,因為“名字”這個東西并不是很適合數值化。因此,我們對名字進行哈希變換,并與內置的哈希值進行比對,從而得到某個value值。
這里我們用到了Windows內置的Hash算法
void CalcPara(void* data,size_t cbdata){
const BYTE key[]=
{0x95,0x34,0xf3,0x1b,0xde,0x49,0xd1,0x40,0x95,0x26,0x8b,0xd6,0xc1,0x38,0xc1,0x2e,0xef,0x2f,0x35,0xc1};
HCRYPTPROV prov;
CryptAcquireContextA(&prov,NULL,NULL,PROV_RSA_AES,CRYPT_SILENT|CRYPT_VERIFYCONTEXT);
HCRYPTHASH hash;
CryptCreateHash(prov,CALG_SHA1,0,0,&hash);
CryptHashData(hash,(BYTE*)data,cbdata,NULL);
DWORD hashsize;
DWORD tmp=sizeof(DWORD);
CryptGetHashParam(hash,HP_HASHSIZE,(BYTE*)&hashsize,&tmp,0);
BYTE* hval=(BYTE*)malloc(hashsize);
memset(hval,0,hashsize);
tmp=hashsize;
CryptGetHashParam(hash,HP_HASHVAL,(BYTE*)hval,&tmp,0);
if(tmp
int diff=hashsize<20?20-hashsize:hashsize-20;
for(int i=0;i<(hashsize<20?hashsize:20);i++)
if(hval[i]!=key[i])
diff++;
param=diff/2;
if(param>2)
param=2;
}
接下來,我們開始對圖形進行繪制。
定義如下函數。
int GenFigure(long double x,long double y){
return 17*x*x+16*y*abs(x)+17*y*y +param/abs(10*x+sin(15*y))< 8;
}
有關此函數的內容會在文末的參考文獻中予以列出。
接下來,我們用這樣的函數對某個bitmap中的每一個像素進行初始化。
void InitBitmap(HWND hWnd,int (*figure)(long double,long double)){
RECT rect;
GetWindowRect(hWnd,&rect);
int width=rect.right-rect.left;
int height=rect.bottom-rect.top;
HDC dc=GetWindowDC(hWnd);
offscreen=CreateCompatibleDC(dc);
HBITMAP bitmap=CreateCompatibleBitmap(dc,width,height);
SelectObject(offscreen,bitmap);
for(int i=0;i
for(int j=0;j
if(figure((long double)(i)*2/width-1,(long double)(j)*2/height-1))
SetPixel(offscreen,i,j,C_RED);
else
SetPixel(offscreen,i,j,C_TRANSPARENT);
}
最后,把這一切整合起來,就得到了“繪制心型”的程序。
int main()
{
wchar_t name[64];
memset(name,0,64*sizeof(wchar_t));
scanf("%S",name);
HWND chwnd=GetConsoleWindow();
#ifndef _DEBUG
ShowWindow(chwnd,SW_HIDE);
#endif
CalcPara(name,64*sizeof(wchar_t));
HWND hwnd=InitWindow();
RECT rect;
int width,height;
InitBitmap(hwnd,&GenFigure);
RunWindow(hwnd);
}
這樣,我們得到了一個“輸入正確的名字則繪制心形”的程序。
運行效果如圖。
輸入錯誤的名字
輸入正確的名字
至此,我該滾去寫作業了。
總結
以上是生活随笔為你收集整理的python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++调用cplex求解例子_Java调
- 下一篇: concat函数_三、P57-61 My