|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 AnisHan 于 2022-4-20 20:51 编辑
问题就是我使用SetWindowLongPtr更改子窗口过程的时候发生了异常
我Debug了一下发生了异常 在DefWindowProc哪里,就是最后的位置,很难受。
这里引发异常叫 0xC0000005
感谢
代码如下:
- HINSTANCE hin; //those two global variables are defined at the beginning
- WNDPROC ScrollPR;
- // and ... i omitted the WinMain function because that just is a normal WinMain with Message Loop, WndClass inside
- LRESULT CALLBACK ScrollProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
- MessageBeep(0);
- TCHAR szBuffer[16];
- wsprintf(szBuffer, TEXT("%d"), GetLastError());
- MessageBox(hwnd, szBuffer, NULL, MB_OK);
- switch (message)
- {
- case WM_KEYDOWN:
- MessageBeep(0);
- break;
- default:
- break;
- }
-
- return DefWindowProc(ScrollPR, hwnd, message, wParam, lParam);//CallWindowProc(ScrollPR, hwnd, message, wParam, lParam);
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- static RECT rect;
- static int cxChar, cyChar;
- HDC hdc;
- PAINTSTRUCT ps;
- int i;
- LPDRAWITEMSTRUCT pdis;
- TCHAR szBuffer[16];
- static HWND ScrollBar;
- static int pos;
- switch (message)
- {
- case WM_CREATE:
- cxChar = LOWORD(GetDialogBaseUnits());
- cyChar = HIWORD(GetDialogBaseUnits());
- ScrollBar = CreateWindow(
- TEXT("scrollbar"),
- NULL,
- WS_CHILD | WS_VISIBLE | SBS_VERT | WS_TABSTOP,
- 10, 10, 20, 200,
- hwnd,
- (HMENU)1,
- hin,
- NULL
- );
-
- SetScrollRange(ScrollBar, SB_CTL, 0, 100, FALSE);
- ScrollPR = GetWindowLongPtr(ScrollBar, GWLP_WNDPROC);
- SetWindowLongPtr(ScrollBar, GWLP_WNDPROC, (LONG)ScrollProc);
-
-
- return 0;
- case WM_VSCROLL:
- //SetWindowLong(lParam, GWLP_WNDPROC,(LONG) ScrollProc);
- switch (wParam)
- {
- case SB_LINEDOWN:
- pos++;
- break;
- default:
- break;
- }
- pos = pos % 101;
- SetScrollPos(ScrollBar, SB_CTL, pos, TRUE);
- return 0;
- case WM_SIZE:
- rect.left = 24 * cxChar;
- rect.top = 2 * cyChar;
- rect.right = LOWORD(lParam);
- rect.bottom = HIWORD(lParam);
- return 0;
- case WM_SETFOCUS:
- SetFocus(ScrollBar);
- return 0;
-
- case WM_CTLCOLORSCROLLBAR:
-
- return CreateSolidBrush(RGB(0, 0xFF, 0));
- case WM_COMMAND:
- switch (HIWORD(wParam))
- {
- case BN_CLICKED:
- if (LOWORD(wParam) == 1)
- {
- MessageBeep(0);
- }
-
- default:
- break;
- }
- return 0;
- case WM_PAINT:
- hdc = BeginPaint(hwnd, &ps);
-
- EndPaint(hwnd, &ps);
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
复制代码
书上的SetWindowLong是真的坑我试了好多遍用GetErrorCode 告诉我 Invalid Index我上msdn看看才发现 superseded by SetWindowLongPtr枯了
|
|