vba 当触发KillTimer时,excel直接闪退了,连看代码出错的的时间都没有,敢问大神原因?

```Public Declare PtrSafe Function SetTimer Lib "user32" ( _
    ByVal HWnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As LongPtr) As Long

Public Declare PtrSafe Function KillTimer Lib "user32" ( _
    ByVal HWnd As Long, _
    ByVal nIDEvent As LongPtr) As Long

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public TimerID As Long
Public mymy As Integer
Sub StartTimer()
    TimerID = SetTimer(0&, 0&, 50&, AddressOf TimerProc)
    DoEvents
End Sub

Sub EndTimer()'触直接excel闪退
    On Error Resume Next
    KillTimer 0&, TimerID
End Sub
Sub TimerProc()
    mymy = mymy + 1
    Sheet1.Cells(5, 5) = mymy
End Sub

1个回答

参考:
http://www.exceloffice.net/archives/1245

不要在vba/vb里使用带有回调函数的api(比如你这个addressof TimerProc),因为vba/vb缺乏异常处理机制,在回调中的异常会导致整个程序崩溃

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复lostfalling: 用死循环+Sleep函数
8 个月之前 回复
Java81883
lostfalling 那个是可以但是设定时间最少是1秒,不能设成毫秒,这个调用API程序会崩溃,还有其他可用的方法不?
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
我用了两个定时器一个读i2c ,一个读 IO口可是I2C只能程序运行的时候打开这是为什么那
```void sanjitutai::OnTimer(UINT_PTR nIDEvent) { switch (nIDEvent) { case DealData_timer://每秒一次的处理 DealData(); /*KillTimer(DealData_timer);*/ break; case BatteryData_timer: //每分钟一次的处理 ReadBattery(); /* KillTimer(BatteryData_timer);*/ break; default: ; } CDialog::OnTimer(nIDEvent); } BOOL sanjitutai::ReadBattery() { HANDLE hI2C; // I2C设备操作号 I2C_TRANSACTION_INFO i2cInfo; byte InBuffer = 0 ; hI2C = I2C_Open(L"I2C1:"); if(hI2C == INVALID_HANDLE_VALUE) { printf("Open I2C Device fail!\r\n"); I2C_Close(hI2C); return 0; } I2C_Close(hI2C); return 0; } ```
MFC 中SetTimer OnTimer KillTimer 的使用
刚学MFC,想做一个倒计时器,下面为部分代码,ToSecond和ToTimeFormat 是秒和时间字符串的转换。大神们知道问题出在哪里吗? void CTimerDlg::OnBnClickedBegin() { // TODO: 在此添加控件通知处理程序代码 CString szTimeFormat; GetDlgItemText(IDC_IN, szTimeFormat); SetDlgItemText(IDC_OUT, szTimeFormat); iSecond = ToSecond(szTimeFormat); SetTimer(ID_TIMER, 1000, NULL); } void CTimerDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialogEx::OnTimer(nIDEvent); CString szTimeFormat; if (iSecond == -1) { return; } while (iSecond >= 0) { szTimeFormat = ToTimeFormat(iSecond); SetDlgItemText(IDC_OUT, szTimeFormat); } iSecond--; } void CTimerDlg::OnBnClickedStop() { // TODO: 在此添加控件通知处理程序代码 KillTimer(ID_TIMER); }
原有vba32位的程序装的是64位的office,declare后面已经加过Ptrsafe了也不行
Public Declare PtrSafe Function SetTimer Lib "user32" _ (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerfunc As Long) As Long Public Declare PtrSafe Function KillTimer Lib "user32" _ (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Function WinProcA(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal SysTime As Long) As Long End Function KillTimer 0, idEvent DoEvents Sleep 100 Application.SendKeys "%s" End Function ' 发送单个邮件的子程序 Sub SendMail(ByVal to_who As String, ByVal subject As String, ByVal body As String, ByVal attachement As String) Dim objOL As Object Dim itmNewMail As Object '引用Microsoft Outlook 对象 Set objOL = CreateObject("Outlook.Application") Set itmNewMail = objOL.CreateItem(olMailItem) With itmNewMail .subject = subject '主旨 .body = body '正文本文 .Bcc = to_who '收件者 .Display '启动Outlook发送窗口 SetTimer 0, 0, 0, AddressOf WinProcA End With Set objOL = Nothing Set itmNewMail = Nothing End Sub '批量发送邮件 Sub BatchSendMail() Dim rowCount, endRowNo endRowNo = Cells(1, 1).CurrentRegion.Rows.Count '逐行发送邮件 For rowCount = 1 To endRowNo SendMail Cells(rowCount, 1), Cells(rowCount, 2), Cells(rowCount, 3), Cells(rowCount, 4) Next End Sub 求大神帮忙改成64位可用的群发邮件程序,不胜感激
VC++MFC对话框付值,有值传过来,但就不显示
主对话框函数 if(b_RdSysID == 1) { KillTimer(1); b_RdSysID = 0; CColDatadlg *pDlg = (CColDatadlg*)AfxGetMainWnd(); pDlg ->ReadSysID(); } 当前对话框函数 void CColDatadlg::ReadSysID() { CString szStr,szTemp;//(RecBuf); CString *pPhoneNum =new CString((char*)RecBuf, 22); //将byte数组转换成cstring szStr = *pPhoneNum; szTemp = szStr.Right(19); szTemp = szStr.Right(19); MessageBox(szTemp);//此处szTemp有值显示 m_EditSysID = szTemp; //都是CString ,这里报错 // GetDlgItem(IDC_EditSystemID)->SetWindowText(szTemp);//试过没用 SetDlgItemText(IDC_EditSystemID,szTemp);//给EDIT值,EDIT仍没变化为空 UpdateData(false); }
Window编程闪屏双缓冲就显示白屏问题,求教,谢谢
一直试验不成功,不知道原因在哪里,用窗口hdc就可以,用创建的hMemDc就不行...一直显示白屏,在这里求教? http://pan.baidu.com/s/1ntIhANB 帖了百度盘的链接,里面有代码. 代码就是加载了背景图,和一张图片.然后移动的图片,出现闪屏,所以想用双缓冲来弄. 懂的人,帮个忙,谢谢.折腾了三天了. 下面是核心代码,真心不知道哪里出错了!!!链接里有工程代码,有点乱,见谅...在学习中..麻烦懂的人帮我看一下.真心请教,谢谢大家了. ``` static HBITMAP hCloudBMP; static HDC cloudDC; BITMAP bm; //for get cloud bmp size static HBITMAP hBgBMP; static HDC bgDC; BITMAP bgBm; static HDC hMemDC; static HBITMAP hTemp; BITMAP bgTest; HDC hdc; int x,y=0; int step=0; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: hCloudBMP=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE); cloudDC =CreateCompatibleDC(hdc); SelectObject(cloudDC,hCloudBMP); ReleaseDC(hWnd, hdc); GetObject(hCloudBMP,sizeof(BITMAP), &bm); //x=bm.bmWidth; //y=bm.bmHeight; hBgBMP=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE); bgDC=CreateCompatibleDC(hdc); SelectObject(bgDC,hBgBMP); ReleaseDC(hWnd, hdc); GetObject(hBgBMP,sizeof(BITMAP),&bgBm); //hTemp=(HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0, LR_DEFAULTSIZE|LR_LOADFROMFILE); hMemDC=CreateCompatibleDC(hdc); hTemp=CreateCompatibleBitmap(hdc, 1280, 720); SelectObject(hMemDC, hTemp); //FillRect(hMemDC, //DeleteObject(hTemp); ReleaseDC(hWnd,hdc); SetTimer(hWnd,100,100,NULL); break; case WM_TIMER: x+=5; y+=3; InvalidateRect(hWnd,NULL,true); //UpdateWindow(hWnd); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: PAINTSTRUCT ps; hdc=BeginPaint(hWnd, &ps); BitBlt(hMemDC,0,0,bgBm.bmWidth,bgBm.bmHeight,bgDC,0,0,SRCCOPY); if(step==0) { BitBlt(hMemDC,x,y,bm.bmWidth,bm.bmHeight,cloudDC,0,0,SRCCOPY); } else { //BitBlt(hdc,x,y,bm.bmWidth,bm.bmHeight,hMemDC,0,0,SRCCOPY); } //BitBlt(hdc,0,0,100,100,hMemDC,0,0,SRCCOPY); BitBlt(hdc,0,0,1280,720,hMemDC,0,0,SRCCOPY); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteDC(cloudDC); DeleteObject(hCloudBMP); DeleteDC(bgDC); DeleteObject(hBgBMP); DeleteDC(hMemDC); KillTimer(hWnd,10); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ```
WM_PAINT难以被触发,怎样才能够让它重绘窗口
小弟刚学VC,这是我在写一个很小的五子棋项目。现在出现了一个问题就是点击鼠标以后窗口不刷新。 网上也去查了一些原因,大致确定是说WMPAINT消息优先级低,一直被忽略。。(当然我现在还不是很确定是不是这个原因) 嗯,我写的代码看起来比较复杂,大家将就一下: 这个是含WinMain的源文件: ``` #include <tchar.h> #include "gobang.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define BOARD_GAP 20 #define CHESS_RADIUS 9 #define WINDOW_TITLE L"五子棋" HDC g_hdc = NULL; HDC g_mdc = NULL; HBITMAP g_hBg = NULL; HPEN g_hDrawer = NULL; HBRUSH g_hBlkPainter = NULL; HBRUSH g_hWhtPainter = NULL; Processor *proc = NULL; int g_iX = 0; int g_iY = 0; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL Init(HWND hwnd); BOOL Paint(HWND hwnd); BOOL StepPaint(HWND hwnd, Point pt, BoardPointType bpt); BOOL CleanUp(HWND hwnd); INT GetCenterX(Point pt); INT GetCenterY(Point pt); Point MouseClassify(); BOOL CheckDistance(int x, int y); VOID CheckMate(HWND hwnd, Point bp); VOID Win(HWND hwnd, Player player); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX wndClass = { 0 }; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = (HICON) ::LoadImage(NULL, L"src\\icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = L"Gobang"; if (!RegisterClassEx(&wndClass)) return -1; HWND hwnd = CreateWindow(L"Gobang", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); if (!Init(hwnd)) { MessageBox(hwnd, L"资源初始化失败:计算机运行内存不足!", L"错误", 0); return FALSE; } if (wndClass.hIcon == NULL || g_hBg == NULL) { MessageBox(hwnd, L"资源初始化失败:素材缺失,请重新安装", L"错误", 0); return FALSE; } MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true); ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); MSG msg = { 0 }; while (msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } UnregisterClass(L"Gobang", wndClass.hInstance); return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT paintStruct; switch (message) { /*case WM_TIMER: Paint(hwnd); break;*/ case WM_PAINT: g_hdc = BeginPaint(hwnd, &paintStruct); Paint(hwnd); EndPaint(hwnd, &paintStruct); ValidateRect(hwnd, NULL); break; case WM_KEYDOWN: if (wParam == VK_ESCAPE) DestroyWindow(hwnd); break; case WM_LBUTTONDOWN: { /*wchar_t temp[50]; swprintf_s(temp, L"Mouse is at (%d, %d)", g_iX, g_iY); MessageBox(hwnd, temp, L"提示", 0);*/ Point clickPoint = MouseClassify(); if (clickPoint.x != 0) { //MessageBox(hwnd, L"Mouse Point caught", L"Debug", 0); if (proc->getPlayer() == PLAYER_BLACK) { if (proc->Dip(clickPoint, PLAYER_BLACK)) { StepPaint(hwnd, clickPoint, BLACK_CHESS); //CheckMate(hwnd, Point{ clickPoint.x, clickPoint.y }, BLACK_CHESS); } } else if (proc->getPlayer() == PLAYER_WHITE) { if (proc->Dip(clickPoint, PLAYER_WHITE)) { StepPaint(hwnd, clickPoint, WHITE_CHESS ); //CheckMate(hwnd, clickPoint, WHITE_CHESS ); } } } break; } case WM_MOUSEMOVE: g_iX = LOWORD(lParam); if (g_iX > WINDOW_WIDTH) g_iX = WINDOW_WIDTH; else if (g_iX < 0) g_iX = 0; g_iY = HIWORD(lParam); if (g_iY > WINDOW_HEIGHT) g_iY = WINDOW_HEIGHT; else if (g_iY < 0) g_iY = 0; break; case WM_DESTROY: CleanUp(hwnd); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); break; } return 0; } BOOL Init(HWND hwnd) { g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); g_hBg = (HBITMAP)LoadImage(NULL, L"src\\bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE | LR_DEFAULTSIZE); g_hDrawer = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); // black pen g_hBlkPainter = CreateSolidBrush(RGB(0, 0, 0)); // black brush g_hWhtPainter = CreateSolidBrush(RGB(255, 255, 255)); proc = new Processor(9, 9); if (g_hdc == NULL || g_mdc == NULL || g_hBlkPainter == NULL || g_hWhtPainter == NULL || proc == NULL) { return FALSE; } //SetTimer(hwnd, 1, 100, NULL); //Game_Paint(hwnd); return TRUE; } BOOL Paint(HWND hwnd) { SelectObject(g_mdc, g_hBg); BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); SelectObject(g_hdc, g_hDrawer); for (int i = 1; i < proc->getBoardWidth() + 1; i++) { MoveToEx(g_hdc, GetCenterX(Point{1, i}), GetCenterY(Point{1, i}), NULL); LineTo(g_hdc, GetCenterX(Point{ proc->getBoardHeight(), i}), GetCenterY(Point{ proc->getBoardHeight(), i })); } for (int i = 1; i < proc->getBoardWidth() + 1; i++) { MoveToEx(g_hdc, GetCenterX(Point{ i, 1}), GetCenterY(Point{ i, 1}), NULL); LineTo(g_hdc, GetCenterX(Point{i, proc->getBoardWidth() }), GetCenterY(Point{i, proc->getBoardHeight() })); } for (int i = 0; i < proc->getBoardWidth(); i++) { for (int j = 0; j < proc->getBoardHeight(); j++) { StepPaint(hwnd, Point{ i+1, j+1 }, proc->getBoardPointType(Point{i+1, j+1})); } } return TRUE; } BOOL StepPaint(HWND hwnd, Point pt, BoardPointType bpt) { if (bpt== NO_CHESS) { return FALSE; } if (bpt == WHITE_CHESS) { SelectObject(g_hdc, g_hDrawer); SelectObject(g_hdc, g_hWhtPainter); Ellipse(g_hdc, GetCenterX(pt) - CHESS_RADIUS, GetCenterY(pt) - CHESS_RADIUS, GetCenterX(pt) + CHESS_RADIUS, GetCenterY(pt) + CHESS_RADIUS); } else { SelectObject(g_hdc, g_hDrawer); SelectObject(g_hdc, g_hBlkPainter); Ellipse(g_hdc, GetCenterX(pt) - CHESS_RADIUS, GetCenterY(pt) - CHESS_RADIUS, GetCenterX(pt) + CHESS_RADIUS, GetCenterY(pt) + CHESS_RADIUS); } return TRUE; } BOOL CleanUp(HWND hwnd) { //KillTimer(hwnd, 1); DeleteDC(g_mdc); ReleaseDC(hwnd, g_hdc); return TRUE; } INT GetCenterX(Point pt) { int scrctrx = WINDOW_WIDTH / 2; int midx = proc->getBoardWidth() / 2; return scrctrx - (midx - pt.x) * BOARD_GAP; } INT GetCenterY(Point pt) { int scrctry = WINDOW_HEIGHT / 2; int midy = proc->getBoardHeight() / 2; return scrctry - (midy - pt.y) * BOARD_GAP; } Point MouseClassify() { for (int i = 1; i < proc->getBoardWidth() + 1; i++) { for (int j = 1; j < proc->getBoardHeight() + 1; j++) { if (CheckDistance(GetCenterX(Point{ i, j}), GetCenterY(Point{i, j}))) { return Point{i, j}; } } } return Point{0, 0}; } BOOL CheckDistance(int x, int y) { int dx = g_iX - x; int dy = g_iY - y; return dx * dx + dy * dy < CHESS_RADIUS * CHESS_RADIUS; } VOID CheckMate(HWND hwnd, Point bp) { /*if (Board_Check(g_board,bp)) { Win(hwnd, currentPlayer); }*/ MessageBox(hwnd, L"CheckMate not completed", L"Warning", 0); } VOID Win(HWND hwnd, Player player) { //wchar_t msg[20] = (player == PLAYER_BLACK) ? L"Black Win!" : L"White Win!"; if (player == PLAYER_BLACK) { MessageBox(hwnd, L"Black Win!", L"结束", 0); } else { MessageBox(hwnd, L"White Win!", L"结束", 0); } exit(0); } ``` 这个是引用的自己写的一个文件gobang.h: ``` #ifndef _GOBANG_H_ #define _GOBANG_H_ #include <windows.h> #define DEFAULT_BOARD_WIDTH 19 #define DEFAULT_BOARD_HEIGHT 19 enum BoardPointType { NO_CHESS, BLACK_CHESS, WHITE_CHESS }; enum Player { PLAYER_BLACK, PLAYER_WHITE }; typedef struct S_Point { int x; int y; } Point; class Board { private: int w; int h; BoardPointType **bp; public: Board(); Board(int w, int h); int getW(); int getH(); BoardPointType getBoardPointType(Point pt); }; class Processor { private: Board *board = NULL; bool vsCom; Player currentPlayer; public: Processor(); Processor(int bw, int bh); Processor(bool vsCom); Processor(int bw, int bh, bool vsCom); int getBoardWidth(); int getBoardHeight(); Player getPlayer(); BoardPointType getBoardPointType(Point pt); BOOL Dip(Point pt, Player pl); }; #endif // gobang.h ``` 为什么运行之后不能够正常点一个点在上面。特别是调用了Ellipse(...)函数前后我看了,各项参数都是很正常的。。 每个参数是什么意思应该很好理解吧,我就不多解释了。proc是我定义的一个全局变量,用于对每个步骤进行响应。g_iX, g_iY是用来记录鼠标的位置。 编程环境:VS 2013
用MFC的对话框载入摄像头并处理,运行接近10分钟后提示内存出错,指针都释放掉了。这是什么原因呀?
![图片说明](https://img-ask.csdn.net/upload/201603/28/1459166465_682627.jpg) 相关的代码: void CMFC_VedioDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 if(!pCapture) { pCapture = cvCaptureFromCAM(0); pFrame = cvQueryFrame(pCapture); drawToDC(pFrame, IDC_Open); } SetTimer(IDC_BUTTON1, 10, NULL); } void CMFC_VedioDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 SetTimer(IDC_BUTTON2, 10, NULL); } void CMFC_VedioDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int i, j; switch(nIDEvent) { case IDC_BUTTON1: { if(m_bOpenCamera) { pFrame = cvQueryFrame(pCapture); drawToDC(pFrame, IDC_Open); } break; } case IDC_BUTTON2: { IplImage* pGray = cvCreateImage(cvGetSize(pFrame), 8, 1); cvCvtColor(pFrame, pGray, CV_BGR2GRAY); cvCanny(pGray,pGray,100,255,3); drawToDC(pGray, IDC_DEAL); cvReleaseImage(&pGray); break; } } CDialogEx::OnTimer(nIDEvent); } void CMFC_VedioDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值c cvReleaseCapture(&pCapture); cvReleaseImage(&pFrame); KillTimer(IDC_BUTTON1); KillTimer(IDC_BUTTON2); CDialogEx::OnClose(); } void CMFC_VedioDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); } PS:参考这个博客写的代码:http://www.cnblogs.com/leven20061001/archive/2012/10/17/2727865.html 运行10分钟程序就报错了,好郁闷呀!
C++中读取.dat文件的问题,急!
求解答,设计目标是想利用一个按钮,打开一个.dat文件并将其中数据放到数组中,但是现在好像没打开.dat文件,大家能不能帮我看看哪儿有问题,应该怎么改。 运行的结果是:啥也没有输出,也没显示“申请成功”,也没显示“申请失败” infile声明: fstream infile 打开.dat文件的按钮的代码: void CdatDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 CFileDialog m_dlg(1,_T("dat"),NULL,NULL,_T("dat(*.dat)|*.dat|*(*.*)|*.*"),this); if (m_dlg.DoModal()==IDOK) { CString m_filename =m_dlg.GetPathName(); str = m_filename; IsShow = TRUE; infile.open(str,ios::in|ios::binary); SetTimer(1,1000/frame,NULL); } } 存放进数组的代码: if (IsShow==TRUE) { if (!infile.read((char*) (buf), sizeof(INT16)*4*2*1024)) { infile.close(); KillTimer(NULL); s1.Format("申请失败......\r\n"); log=s1+log; SetDlgItemText(IDC_EDIT3,log); } else{ for(i=0;i<1024;i++) { in[i][0]= m_buf[i*2]; in[i][1]= m_buf[i*2+1]; s1.Format("申请成功......\r\n"); log=s1+log; SetDlgItemText(IDC_EDIT3,log); } }
WIN32编程断点无法命中WM_TIMER消息
在WIN32编程中,设置了定时器,我在WM_Timer消息中打上断点,却无法命中断点,是怎么回事? 大家看看我的代码有没有问题? ``` LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; int TIMER1 = 1; SYSTEMTIME st; static TCHAR str[50]; switch (message) { case WM_CREATE:SetTimer(hwnd, TIMER1, 100, NULL); return 0; case WM_PAINT: hdc = GetDC(hwnd); TextOut(hdc, 0, 0, str, 50); ReleaseDC(hwnd, hdc); return 0; case WM_TIMER: GetLocalTime(&st); GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &st, "hh':'mm':'ss", str, 50); return 0; case WM_DESTROY: KillTimer(hwnd, TIMER1); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } ```
用VS2010.。里MFC编程基于对话框动态绘图的问题
主要是3个问题(注意是VS2010!!) 我初学MFC 我想要主要实现的功能是 在对话框里添加背景图 并在背景图上动态根据坐标画线,并且图和线都随着对话框大小的改变对应按比例改变。。 1。在我的绘图过程中 最后一段线 就是从N-1到N段 没有画出来 我这里取的是N=12段 共13个点,只有拖拽或者最大化对话框的时候才出现。。; 2。每当画完(不包括缺失的最后一段)时,会出现一个从原点到N-1点的直线(我本意的线可以从坐标点里看出),并且与我本意的线同时出现; 3。我所画的线不随对话框大小改变而改变,包括最大化 拉伸和压缩。可能是我没搞清楚这些点是在什么坐标系下的,但是貌似要ScreenToClient() 也没用。。这是我最纠结的问题。 4.另外CSDN问答不会加图片。。。那种什么链接格式的添加图片法 不懂哎。。 求大神指导,最好有代码例子 或是对我的程序的指导的建议,最好不要对我的代码大动干戈。。。能实现功能就好。 下面是我的代码,中文注释之间的乱码可以无视,应该不影响看代码 这是头文件 // 789Dlg.h : 头文件 // #pragmaonce #include"activexcontrol1.h" // CMy789Dlg 对?话¡ã框¨° class CMy789Dlg : public CDialogEx { // 构1造¨¬ public: CMy789Dlg(CWnd* pParent = NULL); // 标À¨º准Á?构1造¨¬函¡¥数ºy int hua; // 对?话¡ã框¨°数ºy据Y enum { IDD = IDD_MY789_DIALOG }; protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持? // 实º¦Ì现? protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg BOOL OnEraseBkgnd(CDC* pDC); CRect rect; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedButton1(); //afx_msg void InvalidateRect(); afx_msg void OnBnClickedOk(); }; 下面cpp文件 // 789Dlg.cpp : 实º¦Ì现?文?件t // #include"stdafx.h" #include"789.h" #include"789Dlg.h" #include"afxdialogex.h" #ifdef _DEBUG #definenew DEBUG_NEW #endif // 用®?于®¨²应®|用®?程¨¬序¨°“¡ã关?于®¨²”¡À菜?单Ì£¤项?的Ì? CAboutDlg 对?话¡ã框¨° class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对?话¡ã框¨°数ºy据Y enum { IDD = IDD_ABOUTBOX }; protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持? // 实º¦Ì现? protected: DECLARE_MESSAGE_MAP() public: afx_msg BOOL OnEraseBkgnd(CDC* pDC); }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) ON_WM_ERASEBKGND() END_MESSAGE_MAP() // CMy789Dlg 对?话¡ã框¨° CMy789Dlg::CMy789Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMy789Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMy789Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); //DDX_Control(pDX, IDC_ACTIVEXCONTROL1, m_aaa); } BEGIN_MESSAGE_MAP(CMy789Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_ERASEBKGND() ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON1, &CMy789Dlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CMy789Dlg::OnBnClickedOk) END_MESSAGE_MAP() // CMy789Dlg 消?息¡é处ä|理¤¨ª程¨¬序¨° BOOL CMy789Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将?“¡ã关?于®¨²...”¡À菜?单Ì£¤项?添¬¨ª加¨®到Ì?系¦Ì统ª3菜?单Ì£¤中D。¡ê // IDM_ABOUTBOX 必À?须?在¨²系¦Ì统ª3命¨¹令¢?范¤?围¡ì内¨²。¡ê ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设¦¨¨置?此ä?对?话¡ã框¨°的Ì?图ª?标À¨º。¡ê当Ì¡À应®|用®?程¨¬序¨°主¡Â窗ä¡ã口¨²不?是º?对?话¡ã框¨°时º¡À,ê?框¨°架¨¹将?自Á?动¡¥ // 执¡ä行D此ä?操¨´作Á¡Â SetIcon(m_hIcon, TRUE); // 设¦¨¨置?大䨮图ª?标À¨º SetIcon(m_hIcon, FALSE); // 设¦¨¨置?小?图ª?标À¨º // TODO: 在¨²此ä?添¬¨ª加¨®额?外ªa的Ì?初?始º?化¡¥代䨲码? hua=-1; return TRUE; // 除y非¤?将?焦1点Ì?设¦¨¨置?到Ì?控?件t,ê?否¤?则¨°返¤¦Ì回? TRUE } void CMy789Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如¨?果?向¨°对?话¡ã框¨°添¬¨ª加¨®最Á?小?化¡¥按ã¡ä钮£¤,ê?则¨°需¨¨要°a下?面?的Ì?代䨲码? // 来¤¡ä绘?制?该?图ª?标À¨º。¡ê对?于®¨²使º1用®?文?档̦Ì/视º¨®图ª?模¡ê型¨ª的Ì? MFC 应®|用®?程¨¬序¨°,ê? // 这a将?由®¨¦框¨°架¨¹自Á?动¡¥完ª¨º成¨¦。¡ê void CMy789Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文? SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使º1图ª?标À¨º在¨²工¡è作Á¡Â区?矩?形?中D居¨®中D int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘?制?图ª?标À¨º dc.DrawIcon(x, y, m_hIcon); } else { //Invalidate(); //UpdateWindow(); CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文? CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP4); BITMAP bmp; bitmap.GetBitmap(&bmp); CDC dcCompatible; //CDC* pDC; dcCompatible.CreateCompatibleDC(&dc); dcCompatible.SelectObject(&bitmap); //CRect rect; GetClientRect(&rect); //GetUpdateRect(&rect); //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //return CDialogEx::OnEraseBkgnd(pDC); this->GetClientRect(&rect); CDC *pDC=GetDC();//=pwnd->GetDC(); ScreenToClient(rect); int a[100]={0,10,20,30,40,50,60,70,80,90,100,110,250};//x int b[100]={0,10,20,30,40,50,50,70,80,90,100,110,250};//y int height=rect.Height(); int width=rect.Width(); CPen pen1; CPen *oldPen; pen1.CreatePen(PS_SOLID,2,RGB(192,192,2));//创ä¡ä建¡§对?象¨® oldPen=dc.SelectObject(&pen1);//将?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª,ê?并¡é保À¡ê存ä?旧¨¦的Ì?画-笔À¨º int i=-1; for(i=-1;i<=hua;i++) { int x=a[i]; int y=b[i]; int x1=a[i+1]; int y1=b[i+1]; dc.MoveTo(x,y);//定¡§义°?起e点Ì? dc.LineTo(x1,y1);//线?的Ì?终?点Ì? }; pDC->SelectObject(oldPen);//将?以°?前¡ã的Ì?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª''''''*/ Invalidate(); CDialogEx::OnPaint(); } } //当Ì¡À用®?户¡ì拖ª?动¡¥最Á?小?化¡¥窗ä¡ã口¨²时º¡À系¦Ì统ª3调Ì¡Â用®?此ä?函¡¥数ºy取¨?得Ì?光a标À¨º //显?示º?。¡ê HCURSOR CMy789Dlg::OnQueryDragIcon() { returnstatic_cast<HCURSOR>(m_hIcon); } BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì return CDialogEx::OnEraseBkgnd(pDC); } BOOL CMy789Dlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì //CRect rect; //CBitmap bitmap; //bitmap.LoadBitmap(IDB_BITMAP3); //BITMAP bmp; //bitmap.GetBitmap(&bmp); //// //CDC dcCompatible; ////CDC* pDC; //dcCompatible.CreateCompatibleDC(pDC); // dcCompatible.SelectObject(&bitmap); // //CRect rect; // GetClientRect(&rect); // //GetUpdateRect(&rect); // //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); // pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //////return CDialogEx::OnEraseBkgnd(pDC); // int a[100];//x // int b[100];//y // int height=rect.Height(); // int width=rect.Width(); // // //GetUpdateRect(&rect); // return (TRUE); } void CMy789Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì //CMy789Dlg::OnPaint(); ++hua; if (hua>11) { KillTimer(1); }; InvalidateRect(rect,true); CDialogEx::OnTimer(nIDEvent); } void CMy789Dlg::OnBnClickedButton1() { SetTimer(1, 1000, NULL); hua=0;// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? } void CMy789Dlg::OnBnClickedOk() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? CDialogEx::OnOK(); } 求大神!!!!!! [1]: http://
请教 canvas,FrameCFrameWnd,CClientDC到底该如何使用?
题主最近在啃一本游戏编程的书。 看了一半了,被一段代码卡住了。 以下是书上的源代码 void canvasFrame::OnTimer(UINT nIDEvent) { CFrameWnd::OnTimer(nIDEvent); CClientDC dc(this); mdc->SelectObject(car1); dc.BitBlt(x1, y1, 196, 66, mdc, 0, 0, SRCCOPY); //贴第一部车 mdc->SelectObject(car2); dc.BitBlt(x2, y2, 140, 80, mdc, 0, 0, SRCCOPY); //贴第二部车 if (x1 + 196 > x2) { mdc->SelectObject(bomb); dc.BitBlt(x2 - 100, y2, 187, 100, mdc, 0, 100, SRCPAINT); dc.BitBlt(x2 - 100, y2, 187, 100, mdc, 0, 0, SRCAND); KillTimer(hWnd,nIDEvent); } 问题有两个 1.写完后编译器提示canvas,FrameCFrameWnd,CClientDC都不是类名。 然后我就自行添加了这三个类,然后发现不对劲,BitBlt函数那里提示CClientDC内没有此函数,而BitBlt之前使用时并没有被定义在一个自己定义的类中。 我真心想请教,该如何正确使用或者定义这三个类?如果要自行定义,需要自行定义BitBlt等函数吗? 2.mdc->SelectObject(car1);这一行提示“class 'HDC_'没有成员'SelectObject'”这是为什么呢?(我在前面定义了HDC mdc的)这是我在之前没有接触过的问题,百度时也没有查到该如何解决。 希望各位前辈赐教!小弟先谢过啦!论坛新手,并没有悬赏分,抱歉!
VS2010与Google Earth COM API,SetCamera异常
用三个滑块分别实现视高、倾斜角、方位角的设置,刷新视图,在m_geApplication.SetCamera(m_geCamera,1.5); 这个地方出现问题。程序代码如下: dlgRange=pAdjustDlg->m_slide1.GetPos(); dlgTilt=(pAdjustDlg->m_slide2.GetPos()*90)/100; dlgAzimuth=((pAdjustDlg->m_slide3.GetPos()-50)*180)/50; if(dlgRange>50) { geMutiple=((dlgRange-50)/10.0+1.0)*10; //计算缩小倍数 } else if(dlgRange<50) { geMutiple=(10.0/((50-dlgRange)+10))*0.1; //计算放大倍数 } else { geMutiple=1.0; } BOOL m_geTimer; //m_geTimer用来控制Timer()函数 m_geTimer=pAdjustDlg->IsTimer; //判断是否停止调整操作 if(m_geTimer==FALSE) { KillTimer(1); //关闭定时器 } m_geCamera.SetRange(geMutiple*oldRange); //重新设置当前视高 m_geCamera.SetTilt((double)dlgTilt); //重新设置当前倾斜视角 m_geCamera.SetAzimuth((double)dlgAzimuth); //重新设置当前方位视角 ** m_geApplication.SetCamera(m_geCamera,1.5); //刷新视图**前面的代码都正常,调试到这一句就出现异常。我用try……catch……捕获到的是 COleDispatchException这个异常,我不懂这个是什么意思。求各位大侠帮忙看看,挺着急的。
VS2008制作多媒体播放器,WindowsMediaPlayer控件按钮出错
播放媒体后,按停止键(WindowsMediaPlayer),再将鼠标移至菜单栏(没有点击),立刻又继续播放 以下是部分代码: BOOL CPLAYERDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon skinppLoadSkin(_T("blue.ssk"));//blue.ssk为项目下的皮肤文件, // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); m_control=static_cast<CWMPControls>(m_play.GetControls()); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CPLAYERDlg::OnPlay() { // TODO: Add your control notification handler code here CON=1; CString str; if(m_list.GetCount()<=0)MessageBox("请先打开最少一个媒体文件!","Warning",MB_OK); else { KillTimer(1); if(m_list.GetCurSel()<0) { m_list.SetCurSel(0); } index=m_list.GetCurSel(); m_list.GetText(index,str); m_play.SetUrl(str); SetTimer(1,1000,NULL); } } void CPLAYERDlg::OnBnClickedSequence() { // TODO: 在此添加控件通知处理程序代码 FG=0; } void CPLAYERDlg::OnBnClickedRandom() { // TODO: 在此添加控件通知处理程序代码 FG=1; } void CPLAYERDlg::OnBnClickedCycle() { // TODO: 在此添加控件通知处理程序代码 FG=2; } void CPLAYERDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int index1=m_play.GetPlayState(); if(index1==1) { if(FG==0) { CString str; int index=m_list.GetCurSel()+1; if(index>=m_list.GetCount()) index=0; m_list.GetText(index,str); m_play.SetUrl(str); m_list.SetCurSel(index); } else if(FG==1) { srand(time(0)); m_list.SetCurSel(rand()%m_list.GetCount()); m_list.GetText(m_list.GetCurSel(),m_pathname); m_play.SetUrl(m_pathname); } else if(FG==2) { m_list.GetText(m_list.GetCurSel(),m_pathname); m_play.SetUrl(m_pathname); } else; } CDialog::OnTimer(nIDEvent); }
求大神给该段代码详细注解(MFC 俄罗斯方块)
// TetrisDlg.cpp : 实现文件 // #include "stdafx.h" #include "myself.h" #include "Tetris.h" #include "TetrisDlg.h" #include <iostream> #include <math.h> // #include<windows.h> // #include <mmsystem.h>//导入声音头文件 // #pragma comment(lib,"winmm.lib")//导入声音头文件库 using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CTetrisDlg 对话框 CTetrisDlg::CTetrisDlg(CWnd* pParent /*=NULL*/) : CDialog(CTetrisDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTetrisDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTetrisDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_LBUTTONDOWN() ON_WM_TIMER() ON_WM_KEYDOWN() ON_COMMAND(ID_32771, &CTetrisDlg::On32771) ON_COMMAND(ID_32772, &CTetrisDlg::On32772) ON_COMMAND(ID_32773, &CTetrisDlg::On32773) ON_COMMAND(ID_32775, &CTetrisDlg::On32775) ON_COMMAND(ID_32776, &CTetrisDlg::On32776) ON_COMMAND(ID_32777, &CTetrisDlg::On32777) ON_COMMAND(ID_32779, &CTetrisDlg::On32779) ON_COMMAND(ID_32778, &CTetrisDlg::On32778) END_MESSAGE_MAP() // CTetrisDlg 消息处理程序 BOOL CTetrisDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 srand((unsigned)time(NULL)); my_brush.CreateSolidBrush(RGB(0,0,0)); speed=1; score=0; gamestate=STOP; return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CTetrisDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CTetrisDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,0,0)); CPen pen(PS_SOLID,1,RGB(255,255,255)); pDC=GetDC(); pDC->SelectObject(&pen); //绘制方框区 pDC->MoveTo(MAINFRAME_X-1,MAINFRAME_Y-1); pDC->LineTo(MAINFRAME_X+MAX_COL*SIZE+1,MAINFRAME_Y-1); pDC->LineTo(MAINFRAME_X+MAX_COL*SIZE+1,MAINFRAME_Y+MAX_ROW*SIZE+1); pDC->LineTo(MAINFRAME_X-1,MAINFRAME_Y+MAX_ROW*SIZE+1); pDC->LineTo(MAINFRAME_X-1,MAINFRAME_Y-1); //绘制预览区 pDC->MoveTo(LOOK_X,LOOK_Y); pDC->LineTo(LOOK_X+6*SIZE,LOOK_Y); pDC->LineTo(LOOK_X+6*SIZE,LOOK_Y+6*SIZE); pDC->LineTo(LOOK_X,LOOK_Y+6*SIZE); pDC->LineTo(LOOK_X,LOOK_Y); //绘制文字 pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); pDC->TextOut(LOOK_X,LOOK_Y+SIZE*6+20,_T("Score:"),6); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X,LOOK_Y+SIZE*6+55,_T("Speed:"),6); //绘制图标 BITMAP bm1; CDC MemDC1; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_PAUSE); my_bitmap.GetObject(sizeof(BITMAP),&bm1); MemDC1.CreateCompatibleDC(pDC); MemDC1.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+175,bm1.bmWidth,bm1.bmHeight,&MemDC1,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); BITMAP bm2; CDC MemDC2; my_bitmap.LoadBitmap(IDB_START); my_bitmap.GetObject(sizeof(BITMAP),&bm2); MemDC2.CreateCompatibleDC(pDC); MemDC2.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+100,bm2.bmWidth,bm2.bmHeight,&MemDC2,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); BITMAP bm3; CDC MemDC3; my_bitmap.LoadBitmap(IDB_STOP); my_bitmap.GetObject(sizeof(BITMAP),&bm3); MemDC3.CreateCompatibleDC(pDC); MemDC3.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+250,bm3.bmWidth,bm3.bmHeight,&MemDC3,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); DrawNextState(LOOK_X,LOOK_Y); for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_STATE_NOT_EMPTY) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } else if (stateMap[i][j]==MAP_FALLING) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } else { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); CString Cspeed; switch(speed) { case 1: Cspeed.Format(_T("简单")); break; case 2: Cspeed.Format(_T("一般")); break; case 3: Cspeed.Format(_T("困难")); break; } pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CTetrisDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CTetrisDlg::start() { score=0; InitMap(); Produce_NextState(); NexttoActive(); Produce_NextState(); ActivetoMap(); pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); CString Cspeed; switch(speed) { case 1: Cspeed.Format(_T("简单")); break; case 2: Cspeed.Format(_T("一般")); break; case 3: Cspeed.Format(_T("困难")); break; } pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); if (gamestate==OVER) gameover(); } void CTetrisDlg::Produce_NextState() { int Shape=rand()%7; NextColor=rand()%4+1; switch(Shape) //调试中 { case 0: { switch(rand()%4) { case 0: //山条,完成 { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } default:break; } break; } case 1: //长条,完成 { switch(rand()%4) { case 0: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=3; NextState[3][1]=1; break; } case 1: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 2: { NextState[0][0]=0; NextState[0][1]=2; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 3: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } default:break; } break; } case 2: //L,完成 { switch(rand()%4) { case 0: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 3: //倒L,完成 { switch(rand()%4) { case 0: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=3; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 3: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=0; NextState[1][1]=2; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 4: //正Z { switch(rand()%4) { case 0: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=3; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 3: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=0; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=2; break; } default:break; } break; } case 5: //倒Z { switch(rand()%4) { case 0: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 6: //方格,完成 { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } } void CTetrisDlg::NexttoActive() { for (int i=0;i<4;i++) for (int j=0;j<2;j++) ActiveState[i][j]=NextState[i][j]; ActiveColor=NextColor; } void CTetrisDlg::DrawNextState(int x,int y) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { if (NextState[i][1]>=0&&NextState[i][0]>=0) pDC->StretchBlt(x+SIZE+NextState[i][1]*SIZE,y+SIZE+NextState[i][0]*SIZE,bm.bmWidth,SIZE,&MemDC,0,SIZE*NextColor,SIZE,SIZE,SRCCOPY); } my_bitmap.DeleteObject(); } void CTetrisDlg::ActivetoMap() { int min_row; int min_col; min_row=ActiveState[0][0]; if (ActiveState[1][0]<min_row) min_row=ActiveState[1][0]; if (ActiveState[2][0]<min_row) min_row=ActiveState[2][0]; if (ActiveState[3][0]<min_row) min_row=ActiveState[3][0]; min_col=ActiveState[0][1]; if (ActiveState[1][1]<min_col) min_col=ActiveState[1][1]; if (ActiveState[2][1]<min_col) min_col=ActiveState[2][1]; if (ActiveState[3][1]<min_col) min_col=ActiveState[3][1]; for (int i=0;i<4;i++) { if (stateMap[ActiveState[i][0]-min_row][MAX_COL/2-1+ActiveState[i][1]-min_col]==MAP_STATE_NOT_EMPTY) { gamestate=OVER; break; } else stateMap[ActiveState[i][0]-min_row][MAX_COL/2-1+ActiveState[i][1]-min_col]=MAP_FALLING; } } void CTetrisDlg::OnLButtonDown(UINT nFlags, CPoint point) { if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+100))&&(point.y<=(LOOK_Y+SIZE*6+140))&&gamestate>=STOP) { SetTimer(1,600/speed,NULL); start(); gamestate=PLAY; OnPaint(); } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+100))&&(point.y<=(LOOK_Y+SIZE*6+140))&&gamestate==PAUSE) { SetTimer(1,600/speed,NULL); gamestate=PLAY; } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+175))&&(point.y<=(LOOK_Y+SIZE*6+215))&&gamestate==PLAY) { KillTimer(1); gamestate=PAUSE; } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+250))&&(point.y<=(LOOK_Y+SIZE*6+290))&&gamestate<=PAUSE) { KillTimer(1); pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } CDialog::OnLButtonDown(nFlags, point); } void CTetrisDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent==1) { if (IsBottom()==1) { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j]=MAP_STATE_NOT_EMPTY; BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } } } Sweep(); NexttoActive(); Produce_NextState(); DrawLookBlack(); DrawNextState(LOOK_X,LOOK_Y); ActivetoMap(); if (gamestate==OVER) gameover(); else { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); } } } my_bitmap.DeleteObject(); } } else { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=MAX_ROW-1;i>=0;i--) { for (int j=MAX_COL-1;j>=0;j--) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j]=MAP_STATE_EMPTY; stateMap[i+1][j]=MAP_FALLING; pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+(i+1)*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } my_bitmap.DeleteObject(); } } KillTimer(1); SetTimer(1,600/speed,NULL); CDialog::OnTimer(nIDEvent); } int CTetrisDlg::IsLeftLimit() //1代表不能左移 { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((j==0)||stateMap[i][j-1]==MAP_STATE_NOT_EMPTY) return 1; } } } return 0; } int CTetrisDlg::IsRightLimit() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((j==MAX_COL-1)||stateMap[i][j+1]==MAP_STATE_NOT_EMPTY) return 1; } } } return 0; } int CTetrisDlg::IsBottom() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((i==MAX_ROW-1)||stateMap[i+1][j]==MAP_STATE_NOT_EMPTY) { return 1; } } } } return 0; } void CTetrisDlg::InitMap() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { stateMap[i][j]=MAP_STATE_EMPTY; } } } void CTetrisDlg::InitNextAndActive() { for (int i=0;i<4;i++) { for (int j=0;j<2;j++) { NextState[i][j]=-1; ActiveState[i][j]=-1; } } } void CTetrisDlg::DrawMapBlack() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } void CTetrisDlg::DrawLookBlack() { CRect my(LOOK_X+1,LOOK_Y+1,LOOK_X+6*SIZE-1,LOOK_Y+6*SIZE-1); pDC=GetDC(); pDC->FillRect(my,&my_brush); } void CTetrisDlg::gameover() { KillTimer(1); CString notice; notice.Format(_T("GAME IS OVER!\nYOUR SCORE IS %d"),score); AfxMessageBox(notice); /////////////////////////////////////////清除记录的数字 pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } void CTetrisDlg::RectLeft() { //PlaySound(_T("sounds\\rotateANDmove.WAV"),NULL,SND_FILENAME|SND_ASYNC); if (IsLeftLimit()==0) { int temp[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j-1]=MAP_FALLING; stateMap[i][j]=MAP_STATE_EMPTY; temp [count][0]=i; temp [count][1]=j-1; count++; } } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); count--; for (;count>=0;count--) pDC->StretchBlt(MAINFRAME_X+temp[count][1]*SIZE,MAINFRAME_Y+temp[count][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); for (int i=0;i<4;i++) { if (stateMap[temp[i][0]][temp[i][1]+1]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(temp[i][1]+1)*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,MAINFRAME_X+SIZE+(temp[i][1]+1)*SIZE,MAINFRAME_Y+SIZE+temp[i][0]*SIZE); pDC->FillRect(my,&my_brush); } } } } void CTetrisDlg::RectRight() { if (IsRightLimit()==0) { int temp[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=MAX_COL-1;j>=0;j--) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j+1]=MAP_FALLING; stateMap[i][j]=MAP_STATE_EMPTY; temp [count][0]=i; temp [count][1]=j+1; count++; } } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); count--; for (;count>=0;count--) pDC->StretchBlt(MAINFRAME_X+temp[count][1]*SIZE,MAINFRAME_Y+temp[count][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); for (int i=0;i<4;i++) { if (stateMap[temp[i][0]][temp[i][1]-1]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(temp[i][1]-1)*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,MAINFRAME_X+SIZE+(temp[i][1]-1)*SIZE,MAINFRAME_Y+SIZE+temp[i][0]*SIZE); pDC->FillRect(my,&my_brush); } } } } void CTetrisDlg::RectUp() //逆时针旋转 { bool choice; int temp[4][2]; for (int i=0;i<4;i++) { temp[i][1]=ActiveState[i][0]; temp[i][0]=3-ActiveState[i][1]; } int locate[4][2]; //将旋转前falling状态的方块记住 int count=0; for (int j=0;j<MAX_COL;j++) { for (int i=0;i<MAX_ROW;i++) { if (stateMap[i][j]==MAP_FALLING) { locate[count][0]=i; locate[count][1]=j; ++count; } } } --count; int travel[4][2]; //将旋转后的falling状态的方块记住 for (int i=0;i<4;i++) for (int j=0;j<2;j++) travel[i][j]=locate[i][j]+(temp[i][j]-ActiveState[i][j]); choice=TRUE; for (int i=0;i<4;i++) { if (!(travel[i][0]>=0&&travel[i][0]<MAX_ROW&&travel[i][1]>=0&&travel[i][1]<MAX_COL&&stateMap[travel[i][0]][travel[i][1]]!=MAP_STATE_NOT_EMPTY)) choice=FALSE; } if (choice==TRUE) { pDC=GetDC(); for (int i=0;i<4;i++) { stateMap[locate[i][0]][locate[i][1]]=MAP_STATE_EMPTY; //zuotu CRect my(MAINFRAME_X+locate[i][1]*SIZE,MAINFRAME_Y+locate[i][0]*SIZE,MAINFRAME_X+SIZE+locate[i][1]*SIZE,MAINFRAME_Y+SIZE+locate[i][0]*SIZE); pDC->FillRect(my,&my_brush); } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { stateMap[travel[i][0]][travel[i][1]]=MAP_FALLING; //zuotu pDC->StretchBlt(MAINFRAME_X+travel[i][1]*SIZE,MAINFRAME_Y+travel[i][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); } my_bitmap.DeleteObject(); for (int i=0;i<4;i++) for (int j=0;j<2;j++) ActiveState[i][j]=temp[i][j]; for (int j=0;j<3;j++) { for (int i=2;i>=j;i--) if (ActiveState[i][1]>ActiveState[i+1][1]||(ActiveState[i][1]==ActiveState[i+1][1]&&ActiveState[i][0]>ActiveState[i+1][0])) { int x=ActiveState[i+1][0]; int y=ActiveState[i+1][1]; ActiveState[i+1][0]=ActiveState[i][0]; ActiveState[i+1][1]=ActiveState[i][1]; ActiveState[i][0]=x; ActiveState[i][1]=y; } } } } void CTetrisDlg::RectDown() { int temp[4][2]; int origin[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { origin[count][0]=temp [count][0]=i; origin[count][1]=temp [count][1]=j; count++; } } } if (!IsBottom()) { for (int i=3;i>=0;i--) { stateMap [temp[i][0]+1][temp[i][1]]=MAP_FALLING; stateMap [temp[i][0]][temp[i][1]]=MAP_STATE_EMPTY; temp[i][0]++; } } for (int i=0;i<4;i++) { if (stateMap[origin[i][0]][origin[i][1]]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(origin[i][1])*SIZE,MAINFRAME_Y+origin[i][0]*SIZE,MAINFRAME_X+(origin[i][1])*SIZE+SIZE,MAINFRAME_Y+origin[i][0]*SIZE+SIZE); pDC->FillRect(my,&my_brush); } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) pDC->StretchBlt(MAINFRAME_X+temp[i][1]*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } BOOL CTetrisDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN&&gamestate==PLAY) { switch(pMsg->wParam) { case VK_LEFT: RectLeft(); break; case VK_RIGHT: RectRight(); break; case VK_UP: RectUp(); break; case VK_DOWN: RectDown(); break; } } return CDialog::PreTranslateMessage(pMsg); } void CTetrisDlg::Sweep() { bool m_sweep; int bottom; int judge=0; int ii=0; for (int i=MAX_ROW-1;i>=0;i--) { m_sweep=TRUE; for (int j=0;j<MAX_COL;j++) { if(stateMap[i][j]==MAP_STATE_EMPTY) { m_sweep=FALSE; break; } } if (m_sweep) { if (judge!=1) { bottom=i; judge=1; } for (int k=i;k>0;k--) { for (int l=0;l<MAX_COL;l++) { stateMap[k][l]=stateMap[k-1][l]; } } for (int l=0;l<MAX_COL;l++) stateMap[0][l]=MAP_STATE_EMPTY; i++; ii++; } } if (judge==1) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=bottom;i>=0;i--) for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_STATE_NOT_EMPTY) pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); else { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC->FillRect(my,&my_brush); } } my_bitmap.DeleteObject(); score+=ii*ii*100; CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+100,LOOK_Y+SIZE*6+55); pDC=GetDC(); pDC->FillRect(my,&my_brush); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); // PlaySound(_T("sounds\\line.WAV"),NULL,SND_FILENAME|SND_ASYNC); } } void CTetrisDlg::On32771() { if (gamestate>=STOP) { SetTimer(1,600/speed,NULL); start(); gamestate=PLAY; OnPaint(); } if (gamestate==PAUSE) { SetTimer(1,600/speed,NULL); gamestate=PLAY; } } void CTetrisDlg::On32772() { if (gamestate==PLAY) { KillTimer(1); gamestate=PAUSE; } } void CTetrisDlg::On32773() { if (gamestate<=PAUSE) { KillTimer(1); pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } } void CTetrisDlg::On32775() { speed=1; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("简单")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32776() { speed=2; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("一般")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32777() { speed=3; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("困难")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32779() { OnCancel(); } void CTetrisDlg::On32778() { AfxMessageBox(_T("通过键盘控制方块移动和旋转\n上:旋转物块\n下:加速下滑\n左、右:左右移动\n当一行全部填满可消去")); } void CTetrisDlg::OnOK() {} // PlaySound(_T("sounds\\question.wav"),NULL,SND_FILENAME|SND_ASYNC);
MFC 实现启动画面淡入淡出的问题
``` int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; CenterWindow(); // 启动画面窗口居中 SetTimer(1, 3000, NULL); // 启动画面显示时间为 3 秒 AnimateWindow(1200, AW_BLEND); // 窗口渐显,实现淡入效果,时间 1.2 秒 return 0; } void CSplashWnd::OnClose() { AnimateWindow(800, AW_BLEND | AW_HIDE); // 窗口渐隐,实现淡出效果,时间 0.8 秒 CWnd::OnClose(); } void CSplashWnd::OnTimer(UINT_PTR nIDEvent) { KillTimer(1); // 销毁定时器 PostMessage(WM_CLOSE); // 关闭启动画面 CWnd::OnTimer(nIDEvent); } BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC) { HINSTANCE hApp = ::GetModuleHandle(NULL); // 得到应用程序的模块句柄 HBITMAP hbmp = ::LoadBitmap(hApp, MAKEINTRESOURCE(IDB_BITMAP13)); //加载程序中的位图资源 HDC hmdc = ::CreateCompatibleDC(pDC->GetSafeHdc()); // 创建兼容 DC作为内存 DC HBITMAP hbmpOld = (HBITMAP) ::SelectObject(hmdc, hbmp); //将位图选入内存 DC ::BitBlt(pDC->GetSafeHdc(), 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT, hmdc, 0, 0, SRCCOPY); // 将内存 DC 中的内容拷贝到设备 DC 以显示 // 清理,防止内存泄漏 ::SelectObject(hmdc, hbmpOld); ::DeleteObject(hbmp); ::DeleteDC(hmdc); return CWnd::OnEraseBkgnd(pDC); } ``` 实现启动画面淡入淡出时遇到一个疑惑。相关代码如上。按道理应该SetTimer后会响应OnTimer();但是我调试发现竟然没有。。 CSplashWnd对象的创建我是在CMainFrame的OnCreate中进行的; ``` int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { CSplashWnd* temp = new CSplashWnd(); //显示启动画面 temp->OnCreate(lpCreateStruct); Sleep(1000); temp->OnClose(); temp->~CSplashWnd(); temp = NULL; //释放内存 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; .......... ``` temp->OnCreate(lpCreateStruct);后根本就没进入OnTimer()... 是不是我哪个地方概念没搞清楚= =
VC++报错,Access Violation.
void CDahaojiDlg::OnTimer(UINT nlDEvent) { ****** if(nlDEvent==2) { CTimeSpan time=time2-time1; strTime1.Format("%2d小时 %2d分 %2d秒",time.GetHours(),time.GetMinutes(),time.GetSeconds()); GetDlgItem(IDC_STATIC29)->SetWindowText(strTime1); if(strTime1=="0小时0分0秒") { KillTimer(2); SetTimer(21,1000,NULL); } } ****** } On Timer中运行到GetDlgItem(__IDC__STATIC29)->SetWindowText(strTime1); 时出现Unhandled exception in xxx.exe (MFC42.DLL): 0XC0000005: Access Violation.本人是菜鸟不太懂,请各位大侠帮忙。_
无法从“overloaded-function”转换为“TIMERPROC”
SetTimer(NULL, 0, 1000, (TIMERPROC)Timer2Proc); void CALLBACK NetSocket::Timer2Proc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { int err; byte buf[32] = ""; char recvbuf[32] = "connect!!"; byte back[20] = {}; memset(buf, 0, sizeof(buf)); SetTimer(NULL, 1, 10000, SocketTimeOut); err = Send(index, buf, back, 0, sizeof(buf)); KillTimer(NULL, 1); } SetTimer总是报错
贪吃蛇程序,开始可正常操作,按下控制按钮后按键操作不能用
我写了个贪吃蛇程序,用c++ + windows编程写的,左边是游戏区,右边有暂停,加减速等按钮,刚开始可正常操作贪吃蛇,但是在按下按钮后再用上下左右操作就没反应了,不知道为什么?求大神解答 #include <windows.h> #include <vector> #include <ctime> #include <iostream> using namespace std; //定义 游戏区 和 控制区 大小 #define BOUND_SIZE 10 //边框大小 #define SNAKE_SIZE 10 //贪吃蛇方块大小 #define GAME_WIDTH 80 //游戏区宽 #define GAME_HEIGHT 60 //长 #define INFO_WIDTH 30 //游戏信息区宽 #define INFO_HEIGHT GAME_HEIGHT //长 #define MAX_NODE 20 //蛇的最大长度 #define MY_TIMER 1 //定时器ID #define DE_INTERVAL 100 //定义贪吃蛇的默认移动速度--500毫秒/节 // 间隔 #define PAUSE_ID 1//暂停按钮 #define SPDUP_ID 2//加减速 #define SPDDOWN_ID 3 #define GAME_AGAIN_ID 4//游戏重新开始 #define BT_SIZE_WIDTH 10//按钮大小 #define BT_SIZE_HEIGHT 5 // 蛇 vector<POINT> vSnake; int headPos, tailPos; // 头尾的位置 int len; // 长度 int interval; // 速度 POINT direct; // 方向 - 横移 bool needsFood = true; // 是否需要食物 POINT ptFood; // 食物坐标 bool bPause = false; // 暂停状态 enum Status {CONTINUE, WIN, LOST}; Status g_status; //游戏状态 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; 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 = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("The Hello Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } // 初始化蛇 void initSnake() { // 初始两个结点位置 vSnake.clear(); vSnake.resize(MAX_NODE); // 初始长度 len = 2; for (int i = 0; i < len; i++) { vSnake[i].x=i; vSnake[i].y=1; } // 初始尾巴在蛇身的位置 tailPos = 0; headPos = 1; interval = DE_INTERVAL; // 初始速度 direct = {1, 0}; // 初始方向 g_status = CONTINUE; // 初始化游戏状态 needsFood = true; // 需要食物 bPause = false; // 不暂停 } // 获取蛇的结点位置 POINT &getSnakeNode(int index) { int i = tailPos + index; // 尽量在更局部的地方修改变量以增加可维护性-tailPos if(i >= MAX_NODE) { i -= MAX_NODE; } return vSnake[i]; } // 画蛇 void drawSnake(HDC hdc) { int i; POINT ptNode; HBRUSH hBrush = (HBRUSH) GetStockObject (WHITE_BRUSH); //贪吃蛇块上色 SelectObject(hdc, hBrush); /* 也可以for(i = tail; i < head; i++) 但是需要判断head大于界值后从0续起的情况 */ for(i = 0; i < len; i++) { //从蛇尾开始画 ptNode = getSnakeNode(i); Rectangle(hdc, ptNode.x * SNAKE_SIZE + BOUND_SIZE, ptNode.y * SNAKE_SIZE + BOUND_SIZE, (ptNode.x + 1) * SNAKE_SIZE + BOUND_SIZE, (ptNode.y + 1) * SNAKE_SIZE + BOUND_SIZE); } } // 画食物 void drawFood(HDC hdc) { POINT ptNode; int x, y; int i = 0; HBRUSH hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); if (needsFood) { srand(time(0)); //随机数种子 //获取随机坐标,不为蛇身 while(i != len) { x=rand() % (GAME_WIDTH - 1); y=rand() % (GAME_HEIGHT - 1); for(i = 0; i < len; i++) // 食物是否在蛇身,若在则直接退出 { ptNode = getSnakeNode(i); if(ptNode.x == x && ptNode.y == y) break; } } ptFood.x = x; ptFood.y = y; needsFood = false; } SelectObject(hdc,hBrush); // 选取画刷 Ellipse(hdc, BOUND_SIZE + ptFood.x * SNAKE_SIZE, // 画食物 BOUND_SIZE + ptFood.y * SNAKE_SIZE, BOUND_SIZE + (ptFood.x + 1) * SNAKE_SIZE, BOUND_SIZE + (ptFood.y + 1) * SNAKE_SIZE); } // 刷新蛇的状态(移动) void refreshSnake() { POINT newNode; newNode.x = vSnake[headPos].x + direct.x; newNode.y = vSnake[headPos].y + direct.y; // 吃到食物 - 尾不变,头 + 1 if (!needsFood && newNode.x == ptFood.x && newNode.y == ptFood.y) { len++; needsFood = true; if (len == MAX_NODE) { g_status = WIN; } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; vSnake[headPos] = newNode; return; } // 蛇撞墙 if (newNode.x < 0 || newNode.x >= GAME_WIDTH || newNode.y < 0 || newNode.y >= GAME_HEIGHT) { g_status = LOST; return; } POINT ptNode; // 蛇碰到自己的身体 for (int i = 0; i < len; i++) { ptNode = getSnakeNode(i); if (ptNode.x == newNode.x && ptNode.y == newNode.y) { g_status = LOST; return; } } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; tailPos = tailPos + 1 >= MAX_NODE ? 0 : tailPos + 1; vSnake[headPos] = newNode; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; HDC hdc; PAINTSTRUCT ps; RECT rect; HBRUSH hBrush; int nWinW, nWinH, nClientW, nClientH; // 窗口和客户区的长宽 static HWND hPause; //暂停 static HWND hSpdUp; //加速 static HWND hSpdDown; //减速 static HWND hStartAgain; //重新开始 switch (message) { case WM_CREATE: GetWindowRect(hwnd,&rect); // 绘制窗口大小,获取外窗口大小 nWinW = rect.right-rect.left; nWinH = rect.bottom-rect.top; GetClientRect(hwnd,&rect); // 客户区大小,内窗口大小 nClientW = rect.right-rect.left; nClientH = rect.bottom-rect.top; //修改窗口大小,客户区大小+边框大小(nWinX-nClientX外边框) MoveWindow(hwnd, 0, 0, (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE + BOUND_SIZE * 3 + (nWinW - nClientW), (GAME_HEIGHT * SNAKE_SIZE + BOUND_SIZE * 2 + (nWinH-nClientH)), TRUE); hStartAgain = CreateWindow(TEXT("BUTTON"), TEXT("重新开始"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 5) * SNAKE_SIZE / 2 - BOUND_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) GAME_AGAIN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 重新开始按钮,位置(横,纵,长宽) hPause = CreateWindow(TEXT("BUTTON"), TEXT("暂停"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) PAUSE_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 暂停按钮,位置(横,纵,长宽) hSpdUp = CreateWindow(TEXT("BUTTON"), TEXT("速度加快"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BT_SIZE_HEIGHT * SNAKE_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDUP_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //加速按钮,位置(横,纵,长宽) hSpdDown = CreateWindow(TEXT("BUTTON"), TEXT("速度减慢"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BOUND_SIZE + BT_SIZE_HEIGHT * SNAKE_SIZE * 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDDOWN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //减速按钮,位置(横,纵,长宽) initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); //设置定时器 return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hBrush = (HBRUSH) GetStockObject(GRAY_BRUSH); // 给游戏区和控制区上色 SelectObject(hdc, hBrush); Rectangle(hdc, BOUND_SIZE, BOUND_SIZE, // 游戏区 BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE + GAME_HEIGHT * SNAKE_SIZE); Rectangle(hdc, // 控制区 BOUND_SIZE * 2 + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE, BOUND_SIZE + (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE, BOUND_SIZE + INFO_HEIGHT * SNAKE_SIZE); drawSnake(hdc); drawFood(hdc); EndPaint (hwnd, &ps); return 0; case WM_TIMER: //移动蛇 refreshSnake(); if (g_status != CONTINUE) { KillTimer(hwnd, MY_TIMER); (g_status == WIN) ? MessageBox(NULL, TEXT("你赢了"), TEXT("Win"), MB_OK) : MessageBox(NULL,TEXT("你输了"), TEXT("Fail"), MB_OK); initSnake(); } InvalidateRect(hwnd,NULL,TRUE); return 0; case WM_KEYDOWN: switch(wParam) { case VK_UP: //调节方向(向原来方向或相反方向时不反应) if(direct.x!=0) { direct.x=0; direct.y=-1; } break; case VK_DOWN: if(direct.x!=0) { direct.x=0; direct.y=1; } break; case VK_LEFT: if(direct.y!=0) { direct.x=-1; direct.y=0; } break; case VK_RIGHT: if(direct.y!=0) { direct.x=1; direct.y=0; } break; } return 0; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case GAME_AGAIN_ID: KillTimer(hwnd, MY_TIMER); initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); break; case PAUSE_ID: if(bPause) { bPause = false; SetWindowText(hPause, TEXT("暂停")); SetTimer(hwnd, MY_TIMER, interval, NULL); } else { bPause = true; SetWindowText(hPause, TEXT("继续")); KillTimer(hwnd, MY_TIMER); } break; case SPDUP_ID: if(interval >= 100) { interval -= 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; case SPDDOWN_ID: if(interval <= 500) { interval += 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; case WM_DESTROY: KillTimer(hwnd,MY_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
c语言敲得飞机大战出现问题,怎么解决?
![图片说明](https://img-ask.csdn.net/upload/201812/03/1543767864_799759.png) 不知道怎么使用这个文件 #include"resource.h" 求大佬帮助,希望能运行这个飞机大战 所有代码: #include<windows.h> #include"resource.h" #include<stdlib.h> #include<time.h> #include<stdio.h> #define TIMER_DIREN 101 //定义定时器 #define TIMER_DIRENMOVE 102 #define TIMER_ZIDAN 103 #define TIMER_DIRENRELEASE 104 typedef struct Node //敌人,自己,子弹结构体 { int x; int y; struct Node *pnext; }DiRen,FeiJi,ZiDan; void ZaoDiRen(); //造敌人 void ShowDiRen(DiRen *pHead,HWND hWnd); //显示敌人 void ZaoZiDan(); //造子弹 void ShowZiDan(ZiDan *pHead,HWND hWnd); //显示子弹 void DiRenMove(DiRen *pHead); //敌人移动 void ZiDanMove(DiRen *pHead); //子弹移动 void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan);//判断是否射中 void ReleaseDiren(DiRen **pHead); //释放出去的敌人 void ReleaseZidan(ZiDan **pHead); //释放出去的子弹 void ZaoZiJi(HWND hWnd); //造自己 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);//回调函数 int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg; wc.hInstance=hInstance; wc.cbClsExtra=0; wc.cbSize=sizeof(WNDCLASSEX); wc.cbWndExtra=0; wc.hIcon=NULL ; wc.hCursor=NULL ; wc.hIconSm=NULL; wc.lpfnWndProc=pp; wc.lpszClassName="hello"; wc.lpszMenuName=NULL; wc.style=CS_HREDRAW|CS_VREDRAW | CS_OWNDC ; wc.hbrBackground=(HBRUSH)5; RegisterClassEx(&wc); hWnd=CreateWindow("hello","world", WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } DiRen *pDiRen=NULL; //敌人 ZiDan *pZiDan=NULL; //子弹 FeiJi *pZiJi=NULL; //自己 static int score=0; //分数 static char sco[20]; //装分数的字符窜 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { int i=1, //位 jscore; HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; switch(msg) { case WM_TIMER: //定时器 hdc=GetDC(hWnd); //得到设备句柄 hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP4));//载入背景位图 GetObject(hbm, sizeof(bminfo), &bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); BitBlt(hdc,0,0,600,600,memdc,0,0,SRCCOPY); /*itoa(score,sco,10);*/ sprintf(sco,"%d",score); //将分数装入字符窜 jscore=score; while((jscore=jscore/10)>0) //判断分数有几位 i++; TextOut(hdc,0,0,"分数",4); TextOut(hdc,30,0,sco,i); //显示分数 DeleteDC(memdc); ReleaseDC(hWnd,hdc); //释放句柄 DeleteObject(hbm); ZaoZiJi(hWnd); //造自己 if(TIMER_ZIDAN==wParam) //定时器101 { ZiDanMove(pZiDan); //子弹移动 ReleaseZidan(&pZiDan); //释放出屏幕的子弹 } else if( TIMER_DIREN==wParam) //定时器102 { ZaoDiRen(); //造敌人 } else if(TIMER_DIRENRELEASE==wParam) //定时器103 { ReleaseDiren(&pDiRen); //释放出屏幕的敌人 } ShowDiRen(pDiRen,hWnd); //显示敌人 DiRenMove(pDiRen); //敌人移动 ShowZiDan(pZiDan,hWnd); //显示子弹 shoot(hWnd,pZiJi,&pDiRen,&pZiDan); //是否射中 break; case WM_CLOSE: //关闭 PostQuitMessage(0); break; case WM_KEYDOWN: //判断按键 switch(wParam) { case VK_LEFT: //左移 if(pZiJi->x>0) pZiJi->x-=20; break; case VK_RIGHT: //右移 if(pZiJi->x<530) pZiJi->x+=20; break; case VK_UP: //上移 if(pZiJi->y>0) pZiJi->y-=20; break; case VK_DOWN: //下移 if(pZiJi->y<520) pZiJi->y+=20; break; case VK_SPACE: //空格发射子弹 ZaoZiDan(); break; } break; case WM_CREATE: //创建 srand(time(NULL)); pZiJi=(struct Node*)malloc(sizeof(struct Node)); pZiJi->x=200; //自己的x pZiJi->y=500; //自己的y SetTimer(hWnd,TIMER_DIREN,1000,NULL); //设置定时器 SetTimer(hWnd,TIMER_DIRENMOVE,200,NULL); SetTimer(hWnd,TIMER_ZIDAN,100,NULL); SetTimer(hWnd,TIMER_DIRENRELEASE,300,NULL); break; } return DefWindowProc(hWnd,msg,wParam,lParam); } void ZaoDiRen() //造子弹 { DiRen *u; u=(struct Node*)malloc(sizeof(struct Node)); u->x=rand()%550; //子弹的x随机出现 u->y=-10; //出现的纵坐标固定 u->pnext=NULL; if(NULL==pDiRen) { pDiRen=u; } else { u->pnext=pDiRen; //将新产生的链表放在头 pDiRen=u; } } void ShowDiRen(struct Node *pHead,HWND hWnd) //显示敌人 { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));//载入敌人位图 GetObject(hbm, sizeof(bminfo), &bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); while(pHead!=NULL) //敌人链表不为空,显示敌机 { BitBlt(hdc,pHead->x,pHead->y,40,40,memdc,0,0,SRCCOPY); pHead=pHead->pnext; } DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } void ZaoZiJi(HWND hWnd) { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP3));//载入自己的位图 GetObject(hbm, sizeof(bminfo), &bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); BitBlt(hdc,pZiJi->x,pZiJi->y,40,40,memdc,0,0,SRCCOPY); //显示自己 DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } void ZaoZiDan() //造子弹 { ZiDan *u; u=(ZiDan*)malloc(sizeof(ZiDan)); u->x=pZiJi->x+15; u->y=pZiJi->y+10; u->pnext=NULL; if(pZiDan==NULL) { pZiDan=u; } else { u->pnext=pZiDan; //将子弹放在链表头 pZiDan=u; } } void ShowZiDan(ZiDan *pHead,HWND hWnd) //显示子弹 { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP2)); //插入子弹位图 GetObject(hbm, sizeof(bminfo), &bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); while(pHead!=NULL) //子弹链表不为空,显示子弹 { /*Ellipse(hdc,pHead->x,pHead->y,pHead->x+5,pHead->y+5);*/ BitBlt(hdc,pHead->x,pHead->y,10,10,memdc,0,0,SRCCOPY); pHead=pHead->pnext; } DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } void DiRenMove(DiRen *pHead) //敌人移动 { while(pHead!=NULL) //链表不为空,敌人移动 { if(score<500) { pHead->y+=10; pHead=pHead->pnext; } else { pHead->y+=20; pHead=pHead->pnext; } } } void ZiDanMove(DiRen *pHead) //子弹移动 { while(pHead!=NULL) //链表不为空子弹移动 { pHead->y-=20; pHead=pHead->pnext; } } void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan) //判断是否中 { DiRen *js1=*diren; ZiDan *js2=*zidan; int n = 1; while(js1!=NULL) //判断自己是否撞机 { //撞击释放定时器游戏结束 if((ziji->x-js1->x<30&&ziji->x-js1->x>-38)&&(ziji->y-js1->y<25&&ziji->y-js1->y>-38)) { KillTimer(hWnd,TIMER_DIREN); KillTimer(hWnd,TIMER_ZIDAN); KillTimer(hWnd,TIMER_DIRENMOVE); KillTimer(hWnd,TIMER_DIRENRELEASE); MessageBox(hWnd,"You Lose","窗口",MB_OK); PostQuitMessage(0); break; } else js1=js1->pnext; //没有判断下一个敌机 } js1=*diren; //敌机回到头 while((js1=*diren)!=NULL) //判断敌人是否为空 { zidan = &pZiDan; n = 0; while((js2=*zidan)!=NULL) //判断子弹是否为空 { //敌机中弹 if((js2->x - js1->x <= 40&&js2->x - js1->x>=-5)&&(js2->y - js1->y <= 40&&js2->y - js1->y>=-8)) { score+=100; n = 1; *zidan = js2->pnext; if(js1->pnext!=NULL) //链表下节不为空,指向下一个释放中弹的飞机子弹 { *diren = js1->pnext; diren = &pDiRen; free(js1); free(js2); } else *diren = NULL; break; } else { zidan = &js2->pnext; //没中看下一个 } } if(n != 1) //判断是否是中弹出来的 { diren = &js1->pnext; } } } void ReleaseDiren(DiRen **pHead) //释放飞出屏幕的敌人 { DiRen *js=*pHead; while((js=*pHead)!=NULL) { if(js->y>600) //飞出屏幕释放 { *pHead=js->pnext; free(js); } else { pHead = &js->pnext; //看下一个 } } } void ReleaseZidan(ZiDan **pHead) //释放子弹 { ZiDan *js=*pHead; while((js=*pHead)!=NULL) { if(js->y<0) //飞出的子弹释放 { *pHead=js->pnext; free(js); } else pHead=&js->pnext; //没飞出看下一个 } } //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by 打飞机1.rc // #define IDB_BITMAP1 101 #define IDB_BITMAP2 102 #define IDB_BITMAP3 103 #define IDB_BITMAP4 104 #define IDB_BITMAP5 105 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问